审计小trick结合

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ZZZJX7/article/details/79815422

审计小trick结合

在这里分享一些平时看到的审计小技巧
以下都是平时自己看文章记录下来的知识点,知识点可能有点乱,如有错误,请指出。

  1. 出现了SSTI漏洞,在tp框架的情况下,渲染的文件始路径必须是以ThinkPHP的入口文件(index.php)为起点,一直到对应的文件位置,而不是以漏洞文件作为起点。74cms前台某处Getshell漏洞(SSTI) - 漏洞时代 - 最新漏洞_0DaY5.CoM

  2. 也是SSTI的问题,在74cms前台Getshell处, t h i s > d i s p l a y ( file) $file后添加.html后缀,但包含docx可以成功。原因是TP的话会先在当前目录判断文件是否存在,存在则直接返回,不存在才会加.html再去模板目录找。但他传入的是”M/../xxx/xxx.doc”,M这个目录不在当前目录下,linux下就会直接返回false,windows下就可以。【摘录自代码审计小密圈】

  3. 二次注入有长度限制,通过多句执行的方法改掉数据库该字段的长度,就Bypass了。74cms 注入利用 - 乐清小俊杰的博客

  4. php反序列化的应用成功的条件:
    (1)应用程序中必须含有一个实现某个PHP魔幻方法(例如__wakeup或者__destruct)的类,可以用这个类进行恶意攻击,或者开始一个“POP链”。POP链利用参考文章:php对象注入-pop链的构造 - l3m0n - 博客园
    (2)当调用脆弱的unserialize()时,必须声明攻击期间所使用的所有类,否则必须为这些类支持对象自动加载。
    (3)传递给反序列化操作的数据必须来自于一个文件,所以服务器上必须包含有一个包含序列化数据的文件。
    经典案例:Typecho 前台 getshell 漏洞分析

  5. parse_str函数,当parse_str( s Q u e r y , aArray);url编码进行一次decode的,当没处理好就可以造成注入。cmseasy 无限制报错注入(php函数的坑) | 乌云漏洞库,乌云镜像站, WooYun 漏洞库, WooYun 镜像站

  6. 当然intval()返回的值在一个4字节所能表示的范围之内(-2147483648~2147483647),对于超过这个范围的值将用边界值代替。
    PHPYUN很有意思的刷积分和金币漏洞(整形边界和mysql字段混合利用) | 乌云漏洞库,乌云镜像站, WooYun 漏洞库, WooYun 镜像站

  7. is_numeric这个方式直接可以通过hex编码以后再绕过。

  8. move_upload_file函数会在移动文件之前检查文件是否为合法的上传临时文件,如果想搞事,伪造的tmp_name是不会通过函数检查的,但copy就不一样了,不管你来源,不管你目的 ,直接给你怼过去。【摘录自:代码审计就该这么来3 beescms getshell

  9. Php的有一个特性: php自身在解析请求的时候,如果参数名字中包含” “、”.”、”[“这几个字符,会将他们转换成下划线。

  10. 某变量 s t r str),再将0转换成空,则留下了\,这个\可以转义其后的\’,使之变成\’,导致单引号逃逸出转义符的限制,造成注入。

  11. htmlspecialchars这个函数是不对小引号做转义。cmseasy 修复不当前台无限制select union注射(绕过webscan) | 乌云漏洞库,乌云镜像站, WooYun 漏洞库, WooYun 镜像站

  12. 传递参数HTTP_RAW_POST_DATA 这个不走gpc,HTTP_RAW_POST_DATA是php内置的一个全局变量,它用于php在无法识别content-type的情况下将post过来的数据原样地填入变量。

  13. 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 镜像站

  14. 在window环境下,上传了flag.php后,再上传flag.ph(flag.hp…之类),将会自动匹配 ‘*’ ,然后覆盖 ‘flag.php’ 文件

  15. php在双引号中的一种命令格式,如果是只调用变量而不是执行代码那直接{ xxx}就行了 要执行代码就是 { phpinfo()}
    index.php?m=content&c=content&a=public_sub_categorys&menuid=${@phpinfo()}&f=

  16. 当存在sql注入的情况,但是过滤了“,”,利用UNION SELECT * FROM ((SELECT 1)a JOIN (SELECT 2)b实际上也就相当于UNION SELECT 1,2

  17. 查越权的一个小技巧:
    find -name ‘*.php’ | xargs grep -L -e ‘gblinclude’ > no_gblinclude.txt

  18. 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
  1. 把GPC的内容都转义了一遍 碰上这样的情况 就不要再去想简单的跟踪请求参数来注入了,直接去找能重新引入单引号或者反斜杠的地方,比如下面的一些例子
substr() //取到转义处,留下反斜杠
$sth['xx'] //当变量为字符串时 取的是xx位置的一个字符
stripslashes() //这三个就不解释了
urldecode() //这三个就不解释了
base64_decode() //这三个就不解释了
parse_str() //parse_str之前会先urldecode

【摘自代码审计就该这么来2 Mlecms 注入

  1. 利用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更新)

  1. 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函数处理过的参数,但是带入数据库确实拼接的形式,那也是有注入的,单参数也会有注入。

3order传参数的地方一定要人为的去过滤一遍,thinkphp框架没有专门对order后面的参数进行过滤。
https://xianzhi.aliyun.com/forum/topic/79

又复习了一遍
  1. 低版本的TP会存在漏洞,可以构造userid[0]=exp&userid[1]=xxxx’or 1=1#可参考

猜你喜欢

转载自blog.csdn.net/ZZZJX7/article/details/79815422