[网络安全web] 命令执行漏洞

148 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第2天,点击查看活动详情

前言:上次学习命令执行漏洞已过了很久,借此机会,再复习一下这方面的内容。

概念

首先,我们要知道,命令执行漏洞的概念是什么。

图片.png 这是比较官方的解释,不太好理解,我对此的理解是:服务端对客户端输入的命令没有做好完备的过滤,导致导致服务端执行一些调用执行命令的函数。

执行命令的函数

而window上常见的执行命令的函数主要有以下几种,大家也可以在cmd上试一下 whoami:查看服务器用户名

图片.png ipconfig:查看本机IP地址子网掩码以及默认网关等

图片.png dir:查看本目录文件

图片.png linux这些就不举例了,

windows系统常用的一些管道符。

为便于理解,我这样记:直接执行,不需要判断语句真假的有两个:|,&。 区别就在于|:直接执行,而&是前后命令都执行 需要判断语句真假的有两个语句:||,&& 区别在于:如果前面语句为真,||执行前面的,&&都执行。如果前面语句是错误的,那么||执行后面的。&&都不执行。

可以导致命令执行的一些外界命令(特别重要)

system()

本函数就像是 C 语中的函数 system(),用来执行指令,并输出结果。

图片.png

图片.png

passthru()

和system函数类似,执行命令并且可以将输出结果回显

图片.png

图片.png

exec函数

exec函数也是命令执行函数。作用与system差不多,只不过exec函数可以执行,但是不回显结果,只返回执行结果的最后一行。要回显结果可以加上echo函数 这个就不举例了。 shell-exec 这个函数与exec差不多,但是exec是回显最后一句,这个是回显全部。当然,这两个函数有回显的前提是前面都要有echo eval eval() 函数可将括号里面的字符串转换为代码执行,字符串必须是合法的php代码并且用分号结束,这样才能执行代码命令。

图片.png

图片.png 这个是菜鸟教程的例子,很形象,就拿这个作例子吧 我们看,第一个echo直接把那一句输出了,而第二个echo因为前面有eval函数解析字符串,把string和string和string和time这两个字符串解析成了代码。就成功输出了。。。

空格过滤

echoIFS123(错误用法 )\IFS在linux下表示分隔符,相当于一个空格。但是如果单纯的echo$IFS123,bash解释器会把整个IFS123当做变量名,所以导致输不出结果,因此这里加一个{}就固定了变量名

1.echo${IFS}123(正确用法)

输出:123

2.如果目标服务器过滤了大括号"{}" ,这时IFS就不管用了,再回过头看看第一次尝试的写法echo{IFS}就不管用了,再回过头看看第一次尝试的写法echoIFS就不管用了,再回过头看看第一次尝试的写法echoIFS123,shell执行命令时有没有什么办法让shell读取$后面的内容刚好到S处,经过测试后发现,当shell在搜寻变量名称遇到引号 , 符 号 时 就 会 结 束 .

图片.png

加了转义,因为引号需要闭合,如果将左边的引号闭合会是下面的情况。

echo $IFS""123

输出:123

echo IFS"123"也可以,因为在shell命令获取参数时,参数外面可以用引号括起来也可以不括起来 。

3.如果目标过滤了引号和大括号怎么办 ,只要将参数放在一个变量中,然后通过命令+IFS+变量的方式就可以正常使用IFS+变量的方式就可以正常使用IFS+变量的方式就可以正常使用IFS变量,方式如下

a=123;echoIFSIFSIFS123

图片.png

命令中空格被过滤的解决方法:
**{cat,flag.txt}
cat${IFS}flag.txt

cat IFSIFSIFS9.txt $9指传过来的第9个参数

****cat<flag.txt
cat<>flag.txt