1. 程式人生 > >審計小trick結合

審計小trick結合

審計小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#可參考