Matthew

在这里分享一些平时看到的审计小技巧

以下都是平时自己看文章记录下来的知识点,欢迎交流。

(1)

出现了SSTI漏洞,在tp框架的情况下,渲染的文件始路径必须是以ThinkPHP的入口文件(index.php)为起点,一直到对应的文件位置,而不是以漏洞文件作为起点。

    http://0day5.com/archives/4257/

(2)

也是SSTI的问题,在74cms前台Getshell处,$this->display($file) $file后添加.html后缀,但包含docx可以成功。原因是TP的话会先在当前目录判断文件是否存在,存在则直接返回,不存在才会加.html再去模板目录找。但他传入的是”M/../xxx/xxx.doc”,M这个目录不在当前目录下,linux下就会直接返回false,windows下就可以。

—— 摘自「代码审计」小密圈

(3)

二次注入有长度限制,通过多句执行的方法改掉数据库该字段的长度,就Bypass了。

—— 摘自乐清小俊杰博客「74cms注入利用」

http://www.yqxiaojunjie.com/index.php/archives/327/

(4)

php反序列化的应用成功的条件

1.应用程序中必须含有一个实现某个PHP魔幻方法(例如__wakeup或者__destruct)的类,可以用这个类进行恶意攻击,或者开始一个“POP链”。

POP链利用参考文章:php对象注入-pop链的构造 - l3m0n - 博客园

http://www.cnblogs.com/iamstudy/articles/php_object_injection_pop_chain.html


2.当调用脆弱的unserialize()时,必须声明攻击期间所使用的所有类,否则必须为这些类支持对象自动加载。


3.传递给反序列化操作的数据必须来自于一个文件,所以服务器上必须包含有一个包含序列化数据的文件。


经典案例:Typecho 前台 getshell 漏洞分析

https://paper.seebug.org/424/

(5)

parse_str函数,当parse_str($sQuery, $aArray);url编码进行一次decode的,当没处理好就可以造成注入。

cmseasy 无限制报错注入(php函数的坑)

参考链接:

https://wooyun.shuimugan.com/bug/view?bug_no=137013

(6)

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

参考链接:

https://wooyun.shuimugan.com/bug/view?bug_no=128840

(7)

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

(8)

move_upload_file函数会在移动文件之前检查文件是否为合法的上传临时文件,如果想搞事,伪造的tmp_name是不会通过函数检查的,但copy就不一样了,不管你来源,不管你目的 ,直接给你怼过去。

—— 摘录自代码审计

「就该这么来3 beescms getshell」

https://bbs.ichunqiu.com/thread-13977-1-1.html

(9)

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

(10)

 某变量$str全局做过转义,导致%00转义成了\0.控制str_replace的前两个参数,则str_replace('0', '', $str),再将0转换成空,则留下了\,这个\可以转义其后的\’,使之变成\\’,导致单引号逃逸出转义符的限制,造成注入。

(11)

htmlspecialchars这个函数是不对小引号做转义。

cmseasy修复不当前台无限制select union注射

绕过webscan

https://wooyun.shuimugan.com/bug/view?bug_no=94160

(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前台任意代码执行(有版本限制)

https://wooyun.shuimugan.com/bug/view?bug_no=104157

(14)

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

(15)

把GPC的内容都转义了一遍 碰上这样的情况 就不要再去想简单的跟踪请求参数来注入了,直接去找能重新引入单引号或者反斜杠的地方,比如下面的一些例子:

substr() //取到转义处,留下反斜杠$sth['xx'] //当变量为字符串时 取的是xx位置的一个字符stripslashes() //这三个就不解释了urldecode()//这三个就不解释了base64_decode() //这三个就不解释了parse_str() //parse_str之前会先urldecode

——代码审计「就该这么来2 Mlecms 注入」

https://bbs.ichunqiu.com/forum.php?mod=viewthread&tid=13714&extra=page=1&filter=lastpost&orderby=lastpost

(16)

php在双引号中的一种命令格式,如果是只调用变量而不是执行代码那直接{$xxx}就行了 要执行代码就是${ phpinfo()}

index.php?m=content&c=content&a=public_sub_categorys&menuid=${@phpinfo()}&f=

(17)

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

(18)

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

(19)

bool 欺骗

当存在json_decode和unserialize的时候,部分结构会被解释成bool类型,也会造成欺骗。


1.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.phplogined in as bool


2.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.phplogined in unserialize

(20)

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

https://paper.seebug.org/386/

(21)

thinkphp中的Action参数绑定:

参考链接:http://document.thinkphp.cn/manual_3_2.html#action_bind

当开启URL_PARAMS_BIND;

`'URL_PARAMS_BIND'      => true, // URL变量绑定到操作方法作为参数`

具体就是public方法中的参数可以通过外部URL直接传进来,即使方法中没有I()/GET[]/POST[]。

漏洞利用vlcms前台全版本无限制getshell

https://www.t00ls.net/articles-42537.html

(22)

低版本的TP会存在漏洞,可以构造userid[0]=exp&userid[1]=xxxx'or 1=1#

参考链接:https://www.secpulse.com/archives/29826.html


【本文作者Matthew,转载自破壳漏洞社区

源链接

Hacking more

...