审计小trick结合
审计小trick结合
在这里分享一些平时看到的审计小技巧
以下都是平时自己看文章记录下来的知识点,知识点可能有点乱,如有错误,请指出。
出现了SSTI漏洞,在tp框架的情况下,渲染的文件始路径必须是以ThinkPHP的入口文件(index.php)为起点,一直到对应的文件位置,而不是以漏洞文件作为起点。74cms前台某处Getshell漏洞(SSTI) - 漏洞时代 - 最新漏洞_0DaY5.CoM
也是SSTI的问题,在74cms前台Getshell处,file) $file后添加.html后缀,但包含docx可以成功。原因是TP的话会先在当前目录判断文件是否存在,存在则直接返回,不存在才会加.html再去模板目录找。但他传入的是”M/../xxx/xxx.doc”,M这个目录不在当前目录下,linux下就会直接返回false,windows下就可以。【摘录自代码审计小密圈】
二次注入有长度限制,通过多句执行的方法改掉数据库该字段的长度,就Bypass了。74cms 注入利用 - 乐清小俊杰的博客
php反序列化的应用成功的条件:
(1)应用程序中必须含有一个实现某个PHP魔幻方法(例如__wakeup或者__destruct)的类,可以用这个类进行恶意攻击,或者开始一个“POP链”。POP链利用参考文章:php对象注入-pop链的构造 - l3m0n - 博客园
(2)当调用脆弱的unserialize()时,必须声明攻击期间所使用的所有类,否则必须为这些类支持对象自动加载。
(3)传递给反序列化操作的数据必须来自于一个文件,所以服务器上必须包含有一个包含序列化数据的文件。
经典案例:Typecho 前台 getshell 漏洞分析parse_str函数,当parse_str(aArray);url编码进行一次decode的,当没处理好就可以造成注入。cmseasy 无限制报错注入(php函数的坑) | 乌云漏洞库,乌云镜像站, WooYun 漏洞库, WooYun 镜像站
当然intval()返回的值在一个4字节所能表示的范围之内(-2147483648~2147483647),对于超过这个范围的值将用边界值代替。
PHPYUN很有意思的刷积分和金币漏洞(整形边界和mysql字段混合利用) | 乌云漏洞库,乌云镜像站, WooYun 漏洞库, WooYun 镜像站is_numeric这个方式直接可以通过hex编码以后再绕过。
move_upload_file函数会在移动文件之前检查文件是否为合法的上传临时文件,如果想搞事,伪造的tmp_name是不会通过函数检查的,但copy就不一样了,不管你来源,不管你目的 ,直接给你怼过去。【摘录自:代码审计就该这么来3 beescms getshell】
Php的有一个特性: php自身在解析请求的时候,如果参数名字中包含” “、”.”、”[“这几个字符,会将他们转换成下划线。
某变量str),再将0转换成空,则留下了\,这个\可以转义其后的\’,使之变成\’,导致单引号逃逸出转义符的限制,造成注入。
htmlspecialchars这个函数是不对小引号做转义。cmseasy 修复不当前台无限制select union注射(绕过webscan) | 乌云漏洞库,乌云镜像站, WooYun 漏洞库, WooYun 镜像站
传递参数HTTP_RAW_POST_DATA 这个不走gpc,HTTP_RAW_POST_DATA是php内置的一个全局变量,它用于php在无法识别content-type的情况下将post过来的数据原样地填入变量。
mysql特性:
(1)当表的字符集是utf8_general_ci时,测试SQL:Insert into table values (concat(‘ab’, 0x80, ‘cd’)),因为0x80不是有效的UTF-8字符,所以只有ab被写入数据库中,cd会被截断。
(2)当表的字符集是gbk_chinese_ci时,测试SQL:Insert into table values (concat(‘ab’, 0x8027, ‘cd’)),因为0x8027不是有效的gbk字符,所以只有ab被写入数据库中,cd会被截断。
phpcms前台任意代码执行(有php版本限制) | 乌云漏洞库,乌云镜像站, WooYun 漏洞库, WooYun 镜像站在window环境下,上传了flag.php后,再上传flag.ph(flag.hp…之类),将会自动匹配 ‘*’ ,然后覆盖 ‘flag.php’ 文件
php在双引号中的一种命令格式,如果是只调用变量而不是执行代码那直接{{ phpinfo()}
index.php?m=content&c=content&a=public_sub_categorys&menuid=${@phpinfo()}&f=
当存在sql注入的情况,但是过滤了“,”,利用UNION SELECT * FROM ((SELECT 1)a JOIN (SELECT 2)b实际上也就相当于UNION SELECT 1,2
查越权的一个小技巧:
find -name ‘*.php’ | xargs grep -L -e ‘gblinclude’ > no_gblinclude.txt- bool 欺骗
当存在json_decode和unserialize的时候,部分结构会被解释成bool类型,也会造成欺骗。
json_decode示例代码:
$json_str = '{"user":true,"pass":true}';
$data = json_decode($json_str,true);
if ($data['user'] == 'admin' && $data['pass']=='secirity')
{
print_r('logined in as bool'."\n");
}
运行结果:
root@kali:/var/www# php /root/php/hash.php
logined in as bool
unserialize示例代码:
$unserialize_str = 'a:2:{s:4:"user";b:1;s:4:"pass";b:1;}';
$data_unserialize = unserialize($unserialize_str);
if ($data_unserialize['user'] == 'admin' && $data_unserialize['pass']=='secirity')
{
print_r('logined in unserialize'."\n");
}
运行结果如下:
root@kali:/var/www# php /root/php/hash.php
logined in unserialize
- 把GPC的内容都转义了一遍 碰上这样的情况 就不要再去想简单的跟踪请求参数来注入了,直接去找能重新引入单引号或者反斜杠的地方,比如下面的一些例子
substr() //取到转义处,留下反斜杠
$sth['xx'] //当变量为字符串时 取的是xx位置的一个字符
stripslashes() //这三个就不解释了
urldecode() //这三个就不解释了
base64_decode() //这三个就不解释了
parse_str() //parse_str之前会先urldecode
- 利用sprintf函数的特性,导致’单引号的逃逸,造成注入。sprintf漏洞利用的条件:
(1)执行语句使用sprintf或vsrptinf进行拼接;
(2)执行语句进行了两次拼接,第一次拼接的参数内容可控,类似如下代码
<?php
$input1 = '%1$c) OR 1 = 1 /*';
$input2 = 39;
$sql = "SELECT * FROM foo WHERE bar IN ('$input1') AND baz = %s";
$sql = sprintf($sql, $input2);
echo $sql;
//result: SELECT * FROM foo WHERE bar IN ('') OR 1 = 1 /*') AND baz = 39
从WordPress SQLi谈PHP格式化字符串问题(2017.11.01更新)
thinkphp中的Action参数绑定:参考链接
当开启URL_PARAMS_BIND;'URL_PARAMS_BIND' => true, // URL变量绑定到操作方法作为参数
具体就是public方法中的参数可以通过外部URL直接传进来,即使方法中没有I()/GET[]/POST[]。漏洞利用:vlcms前台全版本无限制getshell
反复看了几篇文章,终于明白 thinkphp3.2.3存在注入的类型,也就是作者最后总结的情况
1、直接\$_POST,\$_GET,\$_COOKIE的参数并且通过数组传进where查询是肯定有注入的,典型例子就是上面的这个,很典型了。
2、在thinkphp3.2.3中经过I函数处理过的参数,但是带入数据库确实拼接的形式,那也是有注入的,单参数也会有注入。
3、order传参数的地方一定要人为的去过滤一遍,thinkphp框架没有专门对order后面的参数进行过滤。
https://xianzhi.aliyun.com/forum/topic/79
又复习了一遍
- 低版本的TP会存在漏洞,可以构造userid[0]=exp&userid[1]=xxxx’or 1=1#可参考
上一篇: 浅谈define和const的区别