环境
- mysql类数据库
- apache
- sqllab做靶场
- 部署了safedog作为WAF
开始
比较简单的通用waf在一般情况下不会随意拦截and,or,select,database之类的单词。
为什么呢,首先是用户的文字和上传的图片中这些单词会不可避免的出现,为了照顾用户的体验,所以只有在其有一些特征的情况下才会拦截,如?id=and1
之类的输入是正常的
如果and和1之间加了一个空格,即?id=and%201
噔噔咚
那么根据我们的经验,如果空格被过滤,我们可以尝试一些在sql语句中会被忽视,而在正常的waf中不会被忽视的语句,这样子就可以起到一个不被waf检测,同时又被数据库正常识别的作用,比如最常见的/**/
这样的注释,可以理解为替代空格使用,同时也不会被过滤。
但是显然这样常规的语句很容易被waf给过滤掉,所以我们要在多行注释里面多搞点操作,让waf误以为这一段是不重要的东西,这时候就要往里面加一些 !/*
之类的东西,至于为什么加这些,我也不是很清楚。
那么应该加什么呢,这时候就需要用到burpsuite的intruder模块来尝试了
payload中写
然后我们按照长度排序,可以看到,长度短的那些就是可以用的,很多,所以我们有很多种方法可以绕过这个空格的检测。
接下来如法炮制,select
,union
之类的也是可以用这个来绕过。
最后到了information_schema.tables
这一步,这里就很困难了,因为他是一个长字符串,平时出现这个的概率微乎其微,所以waf只要识别到它就会直接过滤,那有什么办法呢,接下来就是见证奇迹的时刻。
在url编码中,@0a是换行的意思。
MySQL服务器支持一些C风格的注释变体。 通过使用以下格式的注释,这些使您能够编写包含MySQL扩展的代码,但仍然是可移植的:
/*! MySQL-特定代码 */
在这种情况下,MySQL Server会像在任何其他SQL语句中一样解析和执行注释中的代码,但其他SQL服务器将忽略这些扩展。 例如,MySQL Server在以下语句中识别STRAIGHT_JOIN关键字,但其他服务器不会:
SELECT /*! STRAIGHT_JOIN */ col1 FROM table1,table2 WHERE ...
好,介绍了这么多,来到我们的语句
?id=1' union/*/!**!/*/select 1,2,group_concat(table_name) from/*!-- /*%0ainformation_schema.tables*/ --+
如何理解?
首先,在传输的过程中,%0a
将这个语句一分为二,
在/*!--/*
这一段,中间的--注释因为mysql的特性被执行了,注释掉了/*
这一段,同时因为前面换行了,后面的information_schema.tables
没有被注释掉,而且完美的和后面的*/
保持了闭合,让information_schema.tables
成为了前面语句的一部分,这样子就形成了一套组合拳,使得原本被注释掉的语句又重新利用了。
讲这么多已经够了。
发表评论