欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

审计小trick结合

程序员文章站 2024-03-23 13:37:58
...

审计小trick结合

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

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

  2. 也是SSTI的问题,在74cms前台Getshell处,this>display(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(sQuery,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. 某变量strstr),再将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#可参考
相关标签: 代码审计 经验

上一篇: 浅谈define和const的区别

下一篇: