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,转载自破壳漏洞社区】