一、背景

参考链接: http://http://www.360doc.com/content/16/1204/19/27425026_611850045.shtml

1.1 MYSQL在遇到/*! SQL语句*/这种格式的时候,里面的SQL语句会当正常的语句一样被解析。

如图:

以上我们可以看到 where id =1;的部分被mysql解析了。

1.2 如果在!之后是一串数字(这串数字就是mysql数据库的版本号),如果当前数据库的版本号大于等于该数字,SQL语句则执行,否则就不执行(链接中的说法),如图:

如上图所示,在mysql新版本中将这条约束归到了开始的规则里面了,因为在更改了!后面的版本号之后,sql语句照样执行

二、示例

参考链接:http://http://www.freebuf.com/articles/web/22041.html

2.1 回到我们的注入点上来看看,我们使用mysql注释+CRLF来进行payload的构造(注意URL编码):

http://www.modsecurity.org/testphp.vulnweb.com/artists.php?artist=0+div+1+union%23foo*%2F*bar%0D%0Aselect%23foo%0D%0A1%2C2%2Ccurrent_user

对其URL转义如下(注意转行符的解析):

0 div 1 union#foo*/*bar
select#foo
1,2,current_user

这句sql语句到了Mysql的解析引擎后会再次被解析为:

0 div 1 union select 1,2,current_user

可以看到,注释符之间进行了就近原则的交错组合,Mysql的Sql Parser则选择进行了忽略。

我们知道,ModSecurity使用正则表达式来对Input Sql进行匹配检测,对Select、Union在敏感位置的出现都进行了拦截,但是ModSecurity有一个特点(或者叫做优点),它会对输入进行"规范化",规范化的本意本来是防御"基于编码格式、解析顺序"的绕过的。

2.2 注入Payload

绕过分析:

这里采用了"碎片注入法(分段SQL注入)",或者是我们常说的"Split And Balance原则"。例如:

对于最简单的情况,可以使用字符串连接技术将较小的部分构造成一个字符串。不同的数据库使用不同的语法来构造字符串
oracle: 'selec'||'t'
sqlserver: 'selec'+'';
mysql: 'selec'+'t'
(这就是所谓的split and balance思想)
还要注意的是,加号和空格要先进行URL编码后在发送)

这种技术的好处是可以将原本完整的Payload分成几段,利用ModSecurity对SQL语义的理解不全来进行规则绕过。常常用于进行"二值逻辑"的盲注推理。

回到我们的注入点上来看:

对于Mod来说,我们的攻击Payload为:

hUserId=2276&FromDate=a1%27+or&ToDate=%3C%3Eamount+and%27&sendbutton1=Get+Statement

而对于Mysql的解析引擎来说,它会自动去除、转换这些链接控制符,从而变成:

hUserId=22768&FromDate=a1%27+or&ToData=<>amount and%27&sendbutton1=GetStatement

2.3 注入PayLoad:

这里使用了HPP(HTTP Parameter Pollution)注入技术,关于HPP,有很多资料:

http://www.80sec.com/%E6%B5%85%E8%B0%88%E7%BB%95%E8%BF%87waf%E7%9A%84%E6%95%B0%E7%A7%8D%E6%96%B9%E6%B3%95.html

http://www.freebuf.com/articles/web/5908.html

http://hi.baidu.com/aullik5/item/860da508a90709843c42e2ca

http://hi.baidu.com/4b5f5f4b/item/abc28dda72c100f154347f36

https://www.owasp.org/images/b/ba/AppsecEU09_CarettoniDiPaola_v0.8.pdf

回到我们的注入PayLoad上来,我们注意到after这个字段出现了3次,其中后2次的出现其实是产生了逗号的作用,以此来绕过。

2.4 注入Payload:

思路分析:

这里采用了"半开注释符(Unterminated Comments)"+"Mysql注释符代码执行(MySQL Comment Extensions for conditional code execution)"技术来进行绕过。半开注释符是利用Mod的replaceComments来进行敏感关键字的绕过。而"Mysql注释符代码执行"则是Mysql的一个运行机制。

Mysql的Parser引擎会自动解析这种格式中的sql代码,同时其他的数据库(例如MSSQL、ORACLE会自动忽略这些注释),也就是说,这是Mysql特有的特性。

防御方法:采用使用多行匹配(MultiMatch Action)+规范化方法(ReplaceComments)

2.5 注入Payload:

注入分析:这里采用了COOKIE注入

防御方法:

关于这个COOKIE注入,我想眼神几点想法:

在注入点的选择中,HTTP中的任何字段、任何位置都"有可能"产生SQL注入,这里只能说有可能,因为是否能否产生注入,和具体的应用系统的环境有关,即应用系统会使用哪些字段带入数据进行执行.

2.6 注入Payload:

http://www.modsecurity.org/testphp.vulnweb.com/artists.php?artist=%40%40new%20union%23sqlmapsqlmapsqlmapsqlmapsqlmapsqlmapsqlmapsqlmapsqlmapsqlmapswlmapsqlmap%0Aselect%201,2,database%23sqlmap%0A%28%29

payload分析:

这里采用了"Mysql注释(MySQL Comment)"+"换行绕过(New Line trick)"的组合方法来进行Mod的绕过(本质上是对Mod所使用的正则表达式的绕过)

在Mod看来,我们的PayLoad如下:

http://www.modsecurity.org/testphp.vulnweb.com/artists.php?artist=@@new union#sqlmapsqlmapsqlmapsqlmapsqlmapsqlmapsqlmapsqlmapsqlmapsqlmapsqlmap select 1,2,database#sqlmap
()

然而,当这段SQL代码进入Mysql的解析引擎的时候,Mysql看到的是这样的形式:

artist=@@new union select 1,2,database()

防御方法:

SQL是一种极其灵活的命令式语言,各个元素之间的组合可以有很多种,采用正则REGEX的方法来进行匹配常常无法做到精确指导,为了解决这个问题,我们有两种思路:

a) 采用高阶的SQL解析方法,例如AST:

http://www.cnblogs.com/LittleHann/p/3495602.html

b) 改进正则,采用敏感关键字匹配的方法

SecRule REQUEST_FILENAME|ARGS_NAMES|ARGS|XML:/* \
"([\~\!\@\#\$\%\^\&\*\(\)\-\+\=\{\}\[\]\|\:\;\"\'\`\‘\’\<\>].*){4,}" \
"phase:2,t:none,t:urlDecodeUni,block,id:'981173',rev:'2.2.1',msg:'Restricted SQL Character Anomaly Detection Alert - Total # of special characters exceeded',capture,logdata:'%{tx.1}',setvar:tx.anomaly_score=+%{tx.warning_anomaly_score},setvar:tx.sql_injection_score=+1,setvar:'tx.msg=%{rule.msg}',setvar:tx.%{rule.id}-WEB_ATTACK/RESTRICTED_SQLI_CHARS-%{matched_var_name}=%{tx.0}"

2.7 注入Payload:

HTML URL编码链接:http://http://www.w3school.com.cn/tags/html_ref_urlencode.html

Payloag分析:

这里采用了"Mysql错误回显"+"Tab键分隔绕过"的组合方法来进行Mod的绕过,这里的关键点是没有使用传统的空格来进行"Split And Balance"。

如果一定要采用黑名单,则必须进行严格的代码审计和测试,保证黑名单的完整性

例如,在Mysql中允许的分隔符为:
09
0A
0B
0C
0D
A0

防御方法:

采用完整的"准空格分隔符"黑名单CRS

SecRule REQUEST_COOKIES|REQUEST_COOKIES_NAMES|REQUEST_FILENAME|ARGS_NAMES|ARGS|XML:/* \
"(?i:(?:,.*[)\da-f(\"|'|`|´|’|‘)](\"|'|`|´|’|‘)(?:(\"|'|`|´|’|‘).*(\"|'|`|´|’|‘)|\Z|[^(\"|'|`|´|’|‘)]+))|(?:\Wselect.+\W*from)|((?:select|create|rename|truncate|load|alter|delete|update|insert|desc)\s*\(\s*space\s*\())" \
"phase:2,capture,multiMatch,t:none,t:urlDecodeUni,t:replaceComments,block,msg:'Detects MySQL comment-/space-obfuscated injections and backtick termination',id:'981257',tag:'WEB_ATTACK/SQLI',tag:'WEB_ATTACK/ID',logdata:'%{TX.0}',severity:'2',setvar:'tx.msg=%{rule.id}-%{rule.msg}',setvar:tx.anomaly_score=+5,setvar:'tx.%{tx.msg}-WEB_ATTACK/SQLI-%{matched_var_name}=%{tx.0}',setvar:'tx.%{tx.msg}-WEB_ATTACK/ID-%{matched_var_name}=%{tx.0}'

三、总结

Blakclist filtering is not enough  -- 不要依赖黑名单机制

应该使用多种方法进行纵深防御

对输入验证采用安全模型,包括规范化、数据类型、数据格式、数据长度

WAF作为一个防御手段,从某种程序上来说只是增加了攻击者的攻击成本,并不能从根本上解决注入的发生,要解决注入漏洞的产生,保护敏感数据,必须多管齐下,从应用系统、waf、数据库防火墙的角度去思考。

四、附录

4.1 information-schema和mysql数据库结构

记录mysql中的隐患特性相关推荐

  1. MySQL中事务四大特性的实现详解

    MySQL事务的四大特性的实现 基本概念 原子性实现 隔离性实现 已提交读 可重复读 持久性实现 日志文件刷新策略 基本概念 事务的四大特性ACID : 原子性Atomic : 事务的所有的SQL操作 ...

  2. mysql查询包含字符串的记录,MYSQL中利用select查询某字段中包含以逗号分隔的字符串的记录方法...

    首先我们建立一张带有逗号分隔的字符串. CREATE TABLE test(id int(6) NOT NULL AUTO_INCREMENT,PRIMARY KEY (id),pname VARCH ...

  3. 记录-MySQL中的事件调度Event Scheduler

    下面是自己的实例 /*查询event是否开启(查询结果Off为关闭 On为开启)*/ show variables like '%sche%'; /*开启/关闭命令(1开启--0关闭)*/ set g ...

  4. mysql 匹配所有记录_如何记录mysql中所有的查询

    使用–log选项启动mysql: mysqld –log=log_file_name 或将以下内容放在您的my.cnf文件中: log = log_file_name 任何一个都会将所有查询记录到lo ...

  5. mysql中事务的特性_mysql中事务的四大特性

    原子性(Atomicity) 事务就像"原子"一样,不可被分割,组成事务的DML操作语句要么全成功,要么全失败,不可能出现部分成功部分失败的情况. 一致性(Consistency) ...

  6. MySQL中的information_schema

    0.引言 近日在学习网络安全的sql注入时,用到mysql中的information_schema数据库,其思路是利用information_schema中的SCHEMA获取数据库中的table名称. ...

  7. 简单聊聊MySQL中的六种日志

    (一)概述 MySQL中存在着以下几种日志:重写日志(redo log).回滚日志(undo log).二进制日志(bin log).错误日志(error log).慢查询日志(slow query ...

  8. mysql 获取距离当前最新的记录_一文带你了解 MySQL 中的各种锁机制!

    云栖号资讯:[点击查看更多行业资讯] 在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! MySQL中的锁机制,按粒度分为行级锁,页级锁,表级锁,其中按用法还分为共享锁和排他锁. 行级锁 ...

  9. 【MySQL】面试官:如何查询和删除MySQL中重复的记录?

    写在前面 最近,有小伙伴出去面试,面试官问了这样的一个问题:如何查询和删除MySQL中重复的记录?相信对于这样一个问题,有不少小伙伴会一脸茫然.那么,我们如何来完美的回答这个问题呢?今天,我们就一起来 ...

最新文章

  1. Windows10使用技巧
  2. uinty中对Xml文件的操作
  3. [读书笔记]大型分布式网站架构设计与实践.分布式缓存
  4. python量化常用_Python量化常用函数
  5. 一天一个类,一点也不累之HashSet
  6. 数据类型总结(干货)
  7. elasticsearch基础查询
  8. instantclient oracle oci
  9. python txt追加写入_python 实现在txt指定行追加文本的方法
  10. CAD:计算三角形的外接圆圆心
  11. 数学问题:矩阵运算法则及矩阵求导
  12. 达梦数据库在ZYJ环境上通过RPM打包注册服务的步骤
  13. 【NLP】自然语言处理的中间序列建模
  14. C# %253A%252F%252F 咋编码
  15. xml文件读写(C#)
  16. Keynote怎么转换为PPT/PDF
  17. 如何保障企业网络安全
  18. 引用 陈安之---人生格言
  19. jsp房屋租赁管理系统房屋管理系统JSP网上租房系统JSP房产信息网站房屋租赁系统房屋
  20. android 黑马 模拟器,HBuilder调试夜神安卓模拟器方法

热门文章

  1. java虚拟机性能监控调优及原则
  2. I/O多路复用:select、poll和epoll详解
  3. 通俗易懂,Maven依赖pom中的scope详解
  4. 12行代码AC——试题 算法训练 猴子吃包子——解题报告
  5. maven依赖 spark sql_使用Kafka+Spark+Cassandra构建实时处理引擎
  6. 部署docker-consul群集,Harbor构建Docker私有仓库
  7. [java]常用类型转化
  8. MySQL——高阶语句、存储过程(下)
  9. Linux sed编辑器
  10. 吉林大学计算机科学与技术学院王欣,应用改进迭代最近点方法的点云数据配准...