sqli靶场1~5、9关
![]()
第一关
判断是字符型还是数字型,先假设为数字型,如果是数字型2-1就会生效,查不到信息,所以由此得出这是字符型
先判断闭合符(常见闭合符:‘、“、’)、”)、无引号型(数字型))
如果闭合符正确,他会报错,因为我们后面还有一个闭合符
我们可以把后面的闭合符注释掉再看看有没有数据显示
也可以想办法把后面的那个闭合符组成一个完整的闭合符
也是查不出东西的,由此我们可以得出,闭合符是‘
然后我们就可以开始判断有几列数据了,我们先假设它有四列
多了,我们就减少一点,看看是不是3列
有数据显示,那就是3列 知道列数以后,我们就需要判断它的回显位置,因为它有可能username,id,password,如果它回显的位置是1和3,我们的语句就要写在对应的位置
可以用union联合查询来找回显位置,因为它会显示先查出来的数据,所以我们需要把1改成-1,让它前面的语句查不出东西,改成-1是因为绝大多数数据库自增主键id都是从 1 开始,不存在 id=-1 的记录-56789也是可以的
得到了回显位置我们就知道后面的语句写在哪了
我们可以先查一下数据库名
还有数据库的版本
正常的写完整的查找语句也是可以的
现在我们可以查询数据库里面有什么表,让表名输出在一起我们可以用group_concat
?id=-4341' union select 1,(select database()),group_concat(table_name) from information_schema.tables where table_schema='security'--+
查询security下的users表里面的所有字段名称,同时返回表名、当前所在数据库名
select table_name, database(), column_name from information_schema.columns where table_schema='security' and table_name='users'; --+
我们可以用limit来查
也可以使用group_concat
接下来我们就开始查询数据
可以用limit查也可以用group_concat
limit
group_concat
如果前端做了输出限制,我们可以使用substring
第二关
同理第二关也是判断类型
由此可知是数字型
这是列数
查询回显
得知回显位置是2,3,我们的语句就在·2,3输入
查询security下的uagents
这个表中没有username和password字段,接着查users
第三关
结果图(本人是全操作完的)
第四关![]()
第五关(布尔盲注)
判断类型
由此我们可以推断出它是字符型并且闭合符是’
用order by 查出数据有3列
联合查询也是这个界面
我们可以先查询一下数据库长度(8个)
当前数据库名
获取该数据库下所有的表
读取users下的账号密码(修改limit 0,1→limit 1,1、limit 2,1依次读取全部账号密码)
第九关(时间盲注)
判断类型(使用sleep)我们输入and 1=2 时没有回显,所以我们改成and sleep(4),依然没有响应,所以我们可以判断出是字符型,然后就可以测试出来闭合符是‘
然后慢慢猜数据库长度
最后猜得8,网页卡顿5秒
然后猜数据库名
115是s
(中间省略)
121是y,得知数据库名是security
然后猜数据库下的表
慢慢猜,再比对ascll表
读取数据库username第0行的命令:
?id=1' and if(ascii(substr((select username from security.users limit 0,1),1,1))=68,sleep(3),1) --+
读取数据库password第0行的命令:
?id=1' and if(ascii(substr((select password from security.users limit 0,1),1,1))=100,sleep(3),1) --+
建议使用脚本,不然特别特别累!!!
