操作符
重定向<,>,>>
管道|
链式命令;
逻辑运算&&,||
子命令’,$()
新一行\n,%0a
技术分类
- 基于结果的命令注入:应用程序直接输出注入命令的结果
- 经典基于结果的:利用常见的操作符进行连接
- 动态代码赋值:应用程序使用eval函数(java,python,php等)
- 盲注入:应用程序不输出注入命令的结果
- 时间盲注:通过评估应用程序响应返回的时间,判断命令是否成功执行。逐字母判断输出,sleep不同的时间
- 文件半盲注:将执行结果写入web目录文本文件,再请求读取。(需要有写入权限)
- 临时文件半盲注:写入tmp目录,结合时间盲注来读取内容
commix架构
- 攻击向量生成模块
生成攻击payload,由命令注入分隔符列表与命令注入类型生成 - 漏洞检测模块
对HTTP参数执行命令注入 - 漏洞利用模块
与成功检测到注入的payload相同,由用户指定执行的命令
解决误报
误报情况1
存在一个问题,你使用随机字符串作为payload,但是会直接返回回来。直接判断会导致误报。
随机字符串即使不被执行,也有可能被应用程序直接返回。所以采用启发式方法,执行响应预先已知的命令,例如:echo NTAVG$((28+50))$(echo NTAVG)NTAVG
,回显中应当有78
误报情况2
基于响应延迟不准确
盲注入由于响应延迟误报多,计算目标主机平均响应时间,来作为默认延迟。
一些特性
- 支持身份验证
- 支持修改http header字段
- 支持代理
- 支持固定前缀和后缀
- 可扩展
- 支持icmp外带
- 支持读取写入文件等
源码
入口
src/core/main.py
测试连通性,初始化配置和参数
检查请求header是否需要注入
初始化注入参数
初始化注入技术
初始化文件的绝对路径
初始化是否爬取网站
启动注入
src/core/injections/controller/controller.py
controller.do_check(url, http_request_method, filename)
url:注入url
http请求方法
日志文件名
perform_checks
injection_proccess
:对指定参数执行注入过程
注入技术
dynamic_code_evaluation_technique
:基于结果的动态代码执行
classic_command_injection_technique
timebased_command_injection_technique
真正执行命令注入:
src/core/injections/results_based/techniques/eval_based/eb_handler.py
eb_handler.exploitation
:需要传入注入类型和技术
cb_handler.exploitation(url, timesec, filename, http_request_method)
src.core.injections.results_based.techniques.classic
cb_injector.injection_test
:执行注入
获得页面结果
用正则去匹配页面内容,寻找echo出来的东西
具体例子
payload生成:separator+echo+RANDOM STRING+randv1+randv2
加前缀后缀
加tamper
时间盲注:127.0.0.1; str=$(echo EVDZQP); str1=${#str}; if [ "6" != ${str1} ]; then sleep 0; else sleep 1; fi
文件半盲注,写入一个随机串到随机文件,检查文件存在,需要提供web目录127.0.0.1;$(whoami)> UVlLSE5S.txt
临时文件盲注payload:127.0.0.1; str=$(whoami >’/tmp/ UVlLSE5S.txt ’); str=$(cat ’/tmp/ UVlLSE5S.txt ’); str1=${#str}; if [ "1" -ne ${str1} ]; then sleep 0; else sleep 1; fi
修复建议
- 输入验证:过滤,去除危险字符。黑白名单。腾讯代码安全指南\n&;|’"$()`-"做转义
- 转义输入数据:危险字符render为简单文本,而不是shell可以解释的特殊字符