欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

命令执行漏洞 - 命令注入

最编程 2024-07-14 17:55:20
...

条件:
1,是否调用了系统命令
2,函数或函数的参数是否可控
3,是否拼接注入命令
测试:
黑盒渗透测试:网站中有特殊功能,比如Ping、数据库备份等等以及sql语句。
白盒安全测试:查看命令执行变量是否做过滤。
SQL注入和命令注入区别:
sql注入需要判断服务器实用的是哪个数据库。
命令注入则需要判断服务器的操作系统。
绕过:
&:不管第一条命令成不成功都会执行第二条命令 。
&&:第一条命令成功之后执行第二条命令,否则不执行 。
|:上一条命令的输出,作为下一条命令的参数。
||:只有在 || 左边的命令返回假,|| 右边的命令才会被执行。
原理
应用程序有时需要调用一些执行系统命令的函数,如在PHP中,使用System()、exec()、shell_exec()、passthru()、popen()、proc_popen()等函数可以执行系统命令。当攻击者可以控制这些函数中的参数时,就可以将恶意的系统命令拼接到正常命令中,从而造成命令执行攻击。命令执行主要是对输入的命令没有进行过滤,攻击者可以使用&、&&、|、||等命令拼接自己想要查看的信息的相关命令,这样,连同攻击者的命令就会一块执行,这样就造成了命令执行漏洞。
命令注入和命令执行的区别:
命令注入:是靠各种手法在本来执行命令的位置进行拼接绕过。调用的是操作系统命令。
命令执行:是执行不可控的函数导致命令执行。调用的是服务器网站代码。
危险函数
system函数:程序员通过system函数获取指定的目录的文件内容
Exec函数:Exec函数可以用来执行一个外部的应用程序,但是exec函数不返回结果 exec ( string KaTeX parse error: Expected 'EOF', got '&' at position 17: …ommand , array &̲output = ? , int &$return_var = ? ) : string
command 是要执行的命令,output 如果提供了output参数的话,那么命令执行的输出填充此数组(即输出执行结果)
绕过
参考链接:https://www.ghtwf01.cn/index.php/archives/273/
分号
过滤了分号可以用?>绕过。
system

system和passthru是有回显的,其他的就得需要我们自行输出。调用echo或者其他输出函数即可。echo反引号执行系统命令
system()
passthru()
exec()
shell_exec()
popen()
proc_open()
pcntl_exec()
反引号 同shell_exec()
echo
include include包含php文件不会在页面显示出来,所以只能用伪协议。

管道符
window:
| 直接执行后面的语句

|| 如果前面命令是错的那么就执行后面的语句,否则只执行前面的语句

& 前面和后面命令都要执行,无论前面真假
ping
&& 如果前面为假,后面的命令也不执行,如果前面为真则执行两条命令

linux:
以上四种管道符在linux系统中同样适用
; 前面和后面命令都要执行,无论前面真假
短路语法
&&具有短路效果(可以提高一点效率)。左边是false,右边不执行。(遇假就停)
&是无论左边是false还是true,右边都会执行。
||具有短路效果(可以提高一点效率)。左边是true,右边不执行。(遇真就停)
|是无论左边是false还是true,右边都会执行。

/dev/null 2>&1
1:> 代表重定向到哪里,例如:echo “123” > /home/123.txt
2:/dev/null 代表空设备文件
3:2> 表示stderr标准错误
4:& 表示等同于的意思,2>&1,表示2的输出重定向等同于1
5:1 表示stdout标准输出,系统默认值是1,所以">/dev/null"等同于 “1>/dev/null”
:箭头代表重定向,&:代表引用,2:代表标准错误输出,0 表示stdin标准输入,1 表示stdout标准输出,2 表示stderr标准错误
某个命令" 1>/dev/null 2>&1含义呢,就是说,我要执行这个命令,然后这个命令执行过程中的所有标准输出都重定向到/dev/null空设备的意思(就是标准输出不打印),然后2>&1 就是标准错误重定向到标准输出中.而标准输出前面已经说了不打印.那么整体就是标准输出,标准错误都不打印.
空格过滤
< <> 重定向符
%09(需要php环境)
${IFS}
$IFS$9
{cat,flag.php} //用逗号实现了空格功能
%20
%09

黑名单绕过
拼接,base64编码,单双引号,反斜线,$1、 2 等和 2等和 2等和@。

读文件绕过
当cat被过滤时,可以使用如下命令代替
(1)more:一页一页的显示档案内容
(2)less:与 more 类似,但是比 more 更好的是,他可以[pg dn][pg up]翻页
(3)head:查看头几行
(4)tac:从最后一行开始显示,可以看出 tac 是 cat 的反向显示
(5)tail:查看尾几行
(6)nl:显示的时候,顺便输出行号
(7)od:以二进制的方式读取档案内容
(8)vi:一种编辑器,这个也可以查看
(9)vim:一种编辑器,这个也可以查看
(10)sort:可以查看
(11)uniq:可以查看
(12)file -f:报错出具体内容
通配符绕过
?代表一个字符*代表一串字符

内敛执行绕过
命令和$(命令)都是执行命令的方式

过滤目标分隔符
cd命令访问文件夹
过滤运算符
绕过的方式有%0a、%0d、%0D%0A
绕过长度限制
通过>将命令结果存入文件中,使用>命令会将原有文件内容覆盖,如果是存入不存在的文件名,那么就会新建该文件再存入。
符号>>的作用是将字符串添加到文件内容末尾,不会覆盖原内容。

命令换行:我们执行文件中的命令的时候,我们通过在没有写完的命令后面加\,可以将一条命令写在多行。

无字母数字绕过
参考文献:https://blog.****.net/miuzzx/article/details/109143413
异或:在PHP中,两个字符串执行异或操作以后,得到的还是一个字符串。所以,我们想得到a-z中某个字母,就找到某两个非字母、数字的字符,他们的异或结果是这个字母即可。

取反:
利用UTF-8编码的某个汉字,并将其中某个字符取出来。

自增:
利用php特性,在处理字符串变量的算术运算时,PHP沿袭了Perl的习惯,而非C的。如:a = ′ Z ′ ; a=‘Z’;a=′Z′;a++;结果$a的值为’‘AA’,而在C中,变为’’{’,(‘Z’的ASCII值是90,而’{'的ASCII值为91)。注意字符变量只能递增,不能递减,并且只支持纯字母(a-z A-Z)。

php 无参数函数执行
RCE
RCE英文全称:remote command/code execute, Rce又称远程命令/代码执行 ,远程代码执行是指程程序代码在处理输入输出的时候没有受到严格的控制, 导致用户可以构造参数;包含有恶意代码的命令或者其他代码在服务器上 执行。进而获取服务器权限、信息等,是发生在应用程序的逻辑层上的安全漏洞。RCE分为远程命令执行ping和远程代码执行eval命令木马。
参考文献:https://skysec.top/2019/03/29/PHP-Parametric-Function-RCE/
https://hetian.blog.****.net/article/details/105066383
1、通过我们传递的参数来进行RCE
?code=eval(end(current(get_defined_vars())));&a=phpinfo();
2、直接读文件