文件上传
文件上传黑名单过滤ph或者白名单图片则只能寻求配置文件,如.htaccess和.user,ini。
- .htaccess上传时不能加GIF89a头绕过验证,因为会解析错误。.user.ini可以加
SQL注入
- 联合查询不存在的数据时会构造一个虚拟数据,符合认证时会登录成功
- 空格和/**/被过滤时,用()包裹函数会在两边生成空格,如(select(database()))可以在两边自动加空格,但(10)这种不行,这种绕过方式也需要符合语法。
- mysql过滤select没过滤分号可以用show和handler
- sqlite使用sqlite_master进行注入
- 文件上传时可以利用文件名进行注入
代码审计
- is_numeric()最后加%20,返回false
- 测试敏感词过滤可以使用linux下的wfuzz
如:使用fuzzdb的specialchars.txt判断过滤字符(但是我感觉没有seclists好用,500M的字典)
- git泄露可用gitHacker,url/.git可以检测git是否泄露
- assert断言可以实现命令执行
MD5
- md5($pass,true),$pass=ffifdyop,md5后为’ or '6xxx,用于sql绕过
文件包含
- 伪协议
在php://filter里的base64-encode被过滤的情况下,用到convert.iconv.* 死亡绕过
RCE
目录分隔符被过滤,可以用八进制编码
preg_replace在pattern带/e模式下可命令执行
ssti入门:https://www.freebuf.com/column/187845.html
ssti绕过:https://www.cnblogs.com/20175211lyz/p/11425368.html
Tornado render 模板注入,tornado的cookie_secret可以通过handler.settings,也可以使用handler.application.settings来获取
ssti快速构造payload:https://www.cnblogs.com/bmjoker/p/13508538.html
其他姿势
当 CURLOPT_SAFE_UPLOAD 为 true 时,如果在请求前面加上@的话phpcurl组件是会把后面的当作绝对路径请求,来读取文件。当且仅当文件中存在中文字符的时候,Django 才会报错导致获取文件内容。(也就是@文件名
读文件)
在disable_function禁掉了system、shell_exec()此类命令执行的函数时,虽然穿上了马,但是不能进行交互shell,可以利用LD_PRELOAD环境变量突破disable_function限制。唯一条件,PHP 支持putenv()、mail() 。利用方式为:
/bypass_disablefunc.php?cmd=cat /flag&outpath=/tmp/tmpfile&sopath=/var/www/html/bypass_disablefunc_x64.so
其中bypass_disablefunc.php和bypass_disablefunc_x64.so需要上传,并且so文件需要为绝对路径,cmd传参为命令执行结果
cookie伪造:jwt伪造可用jwtpycrack解密,https://jwt.io/#debugger生成JWT
ssti特殊字符绕过:http://www.fhdq.net/