在Web攻防中,SQL注入绝对是一个技能的频繁项,为了技术的成熟化、自动化、智能化,我们有必要建立SQL注入与之相关典型技术之间的关联规则。在分析过程中,整个规则均围绕核心词进行直线展开,我们简单称之为“线性”关联。以知识点的复杂性我们虽然称不上为神经网络,但它依然像滚雪球般对知识架构进行完善升级,所以也可称之为雪球技术。
本文以SQL注入为核心,进行资料信息整合性解读,主要目的有:
为关联分析这门科学提供简单认知;
为初级安全爱好学习者提供参考,大牛绕过;
分析各关键点的区别与联系;
安全扫盲。
本文结构如下:
PS:文章中使用了N多表格形式,主要是为了更好的区别与联系,便于关联分析及对比。
0x01 基本科普
1.1 概念说明
说明:通过在用户可控参数中注入SQL语法,破坏原有SQL结构,达到编写程序时意料之外结果的攻击行为。http://wiki.wooyun.org/web:sql
影响:数据库增删改查、后台登录、getshell
修复:
使用参数检查的方式,拦截带有SQL语法的参数传入应用程序
使用预编译的处理方式处理拼接了用户参数的SQL语句
在参数即将进入数据库执行之前,对SQL语句的语义进行完整性检查,确认语义没有发生变化
在出现SQL注入漏洞时,要在出现问题的参数拼接进SQL语句前进行过滤或者校验,不要依赖程序最开始处防护代码
定期审计数据库执行日志,查看是否存在应用程序正常逻辑之外的SQL语句执行
1.2 注入分类
1) 按照数据包方式分类
i. Get post cookie auth
2) 按照呈现形式
i. 回显型注入
i) Int string search
ii. 盲注
i) Error bool time
iii. 另类注入
i) 宽字节注入
ii) http header 注入
iii) 伪静态
vi) Base64变形
神器解读
2.1 何为神器
SQLMAP
使用方法,参见乌云知识库。
1. sqlmap用户手册
2. sqlmap用户手册[续]
3. sqlmap进阶使用
Tamper 概览
脚本名称
作用
apostrophemask.py
用utf8代替引号
equaltolike.py
like 代替等号
space2dash.py
绕过过滤‘=’ 替换空格字符(”),(’ – ‘)后跟一个破折号注释,一个随机字符串和一个新行(’ n’)
greatest.py
绕过过滤’>’ ,用GREATEST替换大于号。
space2hash.py
空格替换为#号 随机字符串 以及换行符
apostrophenullencode.py
绕过过滤双引号,替换字符和双引号。
halfversionedmorekeywords.py
当数据库为mysql时绕过防火墙,每个关键字之前添加mysql版本评论
space2morehash.py
空格替换为 #号 以及更多随机字符串 换行符
appendnullbyte.py
在有效负荷结束位置加载零字节字符编码
ifnull2ifisnull.py
绕过对 IFNULL 过滤。 替换类似’IFNULL(A, B)’为’IF(ISNULL(A), B, A)’
space2mssqlblank.py
空格替换为其它空符号
base64encode.py
用base64编码替换
space2mssqlhash.py
替换空格
modsecurityversioned.py
过滤空格,包含完整的查询版本注释
space2mysqlblank.py
空格替换其它空白符号(mysql)
between.py
用between替换大于号(>)
space2mysqldash.py
替换空格字符(”)(’ – ‘)后跟一个破折号注释一个新行(’ n’)
multiplespaces.py
围绕SQL关键字添加多个空格
space2plus.py
用+替换空格
bluecoat.py
代替空格字符后与一个有效的随机空白字符的SQL语句。 然后替换=为like
nonrecursivereplacement.py
取代predefined SQL关键字with表示 suitable for替代(例如 .replace(“SELECT”、””)) filters
space2randomblank.py
代替空格字符(“”)从一个随机的空白字符可选字符的有效集
sp_password.py
追加sp_password’从DBMS日志的自动模糊处理的有效载荷的末尾
chardoubleencode.py
双url编码(不处理以编码的)
unionalltounion.py
替换UNION ALL SELECT UNION SELECT
charencode.py
url编码
randomcase.py
随机大小写
unmagicquotes.py
宽字符绕过 GPC addslashes
randomcomments.py
用/**/分割sql关键字
charunicodeencode.py
字符串 unicode 编码
securesphere.py
追加特制的字符串
versionedmorekeywords.py
注释绕过
space2comment.py
Replaces space character (‘ ‘) with comments ‘/**/’
一些妙用:
1. 避免过多的错误请求被屏蔽 参数:--safe-url,--safe-freq
2. 二阶SQL注入 参数:--second-order
3. 从数据库服务器中读取文件 参数:--file-read
4. 把文件上传到数据库服务器中 参数:--file-write,--file-dest
5. 爬行网站URL 参数:--crawl
6. 非交互模式 参数:--batch
7. 测试WAF/IPS/IDS保护 参数:--identify-waf
8. 启发式判断注入 参数:--smart(有时对目标非常多的URL进行测试,为节省时间,只对能够快速判断为注入的报错点进行注入,可以使用此参数。)
9. -technique
B :基于Boolean的盲注(Booleanbased blind)
Q :内联查询(Inline queries)
T :基于时间的盲注(time based blind)
U :基于联合查询(Union query based)
E :基于错误(error based)
S : 栈查询(stack queries)
2.2 源码精读
流程图