数据类型注入- 数字型 字符型 搜索型加密型(base64 json)等
数字型【$id】:正常注入即可,不用考虑闭合情况
字符型【"$id"或者'$id'】:需要考虑闭合情况,末尾加上--+或#
搜索型【'%$id%'】:需要考虑闭合情况
加密型【id=MD==】:把注入语句根据网站传递数据的编码/加密类型来编码或加密后再进行注入
闭合情况:根据报错回显或者源码来分析闭合情况
数字型注入:
字符型注入:
正常注入报错无回显
查看源码,发现使用了【' '】
注入时闭合,成功查询出数据库
搜索型注入:
查看源码,获取闭合情况,使用【'%%'】
注入时闭合
加密型注入:
打开发现参数被编码,看来我们的注入语句也要进行编码才行
将注入语句编码
注入成功获取数据库名
使用sqlmap爆破加密型注入
python sqlmap.py -u "http://127.0.0.1/news.php?base=MQ==" --dbs --tamper=base64encode.py
--tamper#利用给定的脚本篡改注入数据
运行发现出不来结果,明明手工都出来了,查看发现工具只测试了10个字段,但是有17个字段
使用测试--level参数加大测试力度再次进行测试
python sqlmap.py -u "http://127.0.0.1/news.php?base=MQ==" --dbs --tamper=base64encode.py --level=3
--level#测试力度(1-5)级
成功爆出数据库
宽字节注入:
为什么产生宽字节注入?
原因是程序员为了防止SQL注入,就会调用几种转义函数,将单引号或双引号进行转义操作,转义无非便是在单或双引号前加上斜杠()进行转义 ,但这样并非安全,因为数据库使用的是宽字节编码,两个连在一起的字符会被当做是一个汉字,而在PHP使用的UTF8编码则认为是两个独立的字符,如果我们在单或双引号前添加一个字符,使其和斜杠()组合被当作一个汉字,从而保留单或双引号,使其发挥应有的作用。但添加的字符的Ascii要大于128,两个字符才能组合成汉字 ,因为前一个ascii码要大于128,才到汉字的范围 ,这一点需要注意。
转义函数:
addslashes() #函数返回在预定义字符之前添加反斜杠的字符串
mysql_real_escape_string() #函数转义 SQL 语句中使用的字符串中的特殊字符
mysql_escape_string() #转义一个字符串
addslashes()函数:单引号(')、双引号(")、反斜线()与 NUL(NULL 字符)这些字符都会被转义
我们给字符型注入传递的参数使用addslashes()函数包裹
可以发现就算闭合了【' '】依然无法注入成功,是因为我们输入的【'】被在前加上斜杠()进行了转义,无法发挥作用
在单或双引号前添加一个Ascii要大于128的字符,使其和斜杠()组合被当作一个汉字,从而保留单或双引号的作用即可。
Ascii大于128的字符如:%df
在注入语句【'】前添加%df,成功查询出数据库
使用sqlmap爆破
使用--tamper模块中的unmagicquotes.py脚本
python sqlmap.py -u "http://124.70.71.251:46715/new_list.php?id=1" --dbs --tamper=unmagicquotes.py
原文始发于微信公众号(小黑子安全):sql注入-不同数据类型注入
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论