php代碼審計總結

2021-12-25 白帽子社區

    "白帽子社區在線CTF靶場BMZCTF,歡迎各位在這裡練習、學習,BMZCTF全身心為網絡安全賽手提供優質學習環境,連結(http://www.bmzclub.cn/)

"    

在php中可由用戶輸入的變量
$_SERVER$_GET$_POST$_COOKIE$_REQUEST$_FILES

存在命令注入的函數
systemexecpassthrushell_execpopenproc_openpcntl_exec

存在XSS和CSRF的函數

echoprintprintfvprintf<%=$test%>

存在文件包含的函數

includeinclude_oncerequirerequire_onceshow_sourcehighlite_filereadfileflie_get_contentsfopen


存在代碼注入的函數
evalpreg_replaceassertcall_user_funccall_user_func_arraycreate_function

存在SQL注入的語句

文件管理函數

copyrmdirunlinkdeletefwritechmodfgetcfgetcsvfgetsfgetssfilefile_get_contentsfreadreadfileftruncatefile_put_contentsfputcsvfputs

對於此類函數,可以使用php偽協議進行一個繞過。

<?php$a=$_GET['a'];if(stripos($a,'.')){    echo 'no';    return ;}$data = @file_get_contents($a,'r');if($data=="WHT is a good family!"){    require("flag.txt");    echo "flag";}?>

GET形式傳入參數a,a不能含有.,且變量a必須為WHT is a good family!

使用php偽協議進行一個傳參。

文件上傳函數變量覆蓋函數
<?php $flag='flag.txt';extract($_GET); if(isset($a)) {    $content=trim(file_get_contents($flag));        if($a==$content)    {        echo'ctf{xxx}';    }   else   {    echo'no';   }   } ?>

"extract($_GET)"此函數將GET傳入的參數都重新賦值了, $content的值為flag.txt的內容,只有a和content的值相等時,才會輸出flag,所以將$flag賦值一個不存在的文件,那麼$content的值也就為空,此時$content也就變的可控了。

POC:

Session繞過
<?php $flag = "flag{xxxx}"; session_start();if (isset ($_GET['password'])) {    if ($_GET['password'] == $_SESSION['password'])        die ('Flag: '.$flag);    else        print 'Wrong';}mt_srand((microtime() ^ rand(1, 10000)) % rand(1, 10000) + rand(1, 10000));?>

Session的password在未登陸時為空,我們只要上傳一個空的paasword即可繞過。


比較相等繞過
MD5md5('240610708')==md5('QNKCDZO')md5('aabg7XSs')==md5('aabC9RqS')SHA1sha1('aaroZmOk')==sha1('aaK1STfY')sha1('aaO8zKZF')==sha1('aa3OFF9m')明文'0010e2'=='1e3''0x1234Ab'=='1193131''0xABCdef'==' 0xABCdef'

弱類型整型比較
<?php error_reporting(0);$flag = "flag{test}"; $temp = $_GET['password'];is_numeric($temp)?die("no numeric");   if($temp>1336){    echo $flag;} ?>

當一個整形和一個其他類型行比較的時候,會先把其他類型intval再比。

POC:

MD5函數true繞過
$password = $_GET['password'];$sql = "SELECT * FROM users WHERE password = '".md5($password,true)."'";

ffifdyop
129581926211651571912466741651878684928

preg_match繞過    1.數組繞過
    2.回溯次數限制繞過
    3.添加換行符 \n 和 %0astrpos()繞過

    strpos()找的是字符串,那麼傳一個數組給它,strpos()出錯返回null。

sha1()繞過
<?php $flag = "flag{xxxx}"; if (isset($_GET['name']) and isset($_GET['password'])){    if ($_GET['name'] == $_GET['password'])        echo 'Your password can not be your name!';    else if (sha1($_GET['name']) === sha1($_GET['password']))      die('Flag: '.$flag);    else        echo 'Invalid password.';}else    echo 'Login first!';?>

需要構造一對哈希值相等但明文不同的字符串,這裡sha1函數無法處理數組,當處理數組時會報錯返回False,這樣就使得2個參數的哈希值「相等」,這裡傳參2個不同的數組即可繞過所有if。

MD5碰撞

PHP在處理哈希字符串時,會利用」!=」或」==」來對哈希值進行比較,它把每一個以」0E」開頭的哈希值都解釋為0,所以如果兩個不同的密碼經過哈希以後,其哈希值都是以」0E」開頭的,那麼PHP將會認為他們相同,都是0。

0e開頭的md5和原值:QNKCDZO0e830400451993494058024219903391QNKCDZO0e8304004519934940580242199033912406107080e462097431906509019562988736854s878926199a0e545993274517709034328855841020s155964671a0e342768416822451524974117254469s214587387a0e848240448830537924465865611904s214587387a0e848240448830537924465865611904s878926199a0e545993274517709034328855841020s1091221200a0e940624217856561557816327384675

PHP版本存在漏洞的函數

User-Agentt: zerodiumsystem("cat /flag");

值不等MD5相等,用兩個不能MD5轉換的值就可以。

傳數組,strcmp()用兩個無法比較的值,數組和字符串不可比較。

相關焦點

  • 搜索 PHP代碼審計之旅
    但如果這些代碼是分布在一套源碼中(如CMS),需要我們去發現,去找到並會利用,就需要有一定的查找以及利用思路,這次測試的是BlueCMS1.6,重要不在於去復現這個CMS的漏洞,而在先了解一下整個審計思路還有過程是怎麼樣的,去鍛鍊自己的審計能力。由於我比較菜,所以有錯誤的地方也請師傅們指正。何為白盒、黑盒、灰盒測試審計代碼會經常遇到這三個名詞,這又代表是什麼意思那?
  • PHP代碼審計要點
    本文旨在總結一些在PHP代碼中經常造成問題的點,也是我們在審計的時候的關注重點。(PS:本文也只是簡單的列出問題,至於造成問題的底層原因未做詳細解釋,有興趣的看官可以自行GOOGLE或者看看底層C代碼。
  • PHP代碼審計
    代碼審計顧名思義就是檢查原始碼中的缺點和錯誤信息,分析並找到這些問題引發的安全漏洞,並提供代碼修訂措施和建議
  • 代碼審計之php.ini配置詳解
    一、關於php ini介紹php.iniapache在啟動時php.ini被讀取。
  • PHP代碼審計之漫畫CMS
    最近一直在學習代碼審計的相關課程,也在找一些通用的CMS在練習,剛好在安全群裡認識了一位志同道合的道友,於是就一起研究學習,前期還是不怎麼太會,所以也一直兩個人相互傳授經驗和交流,不過還好經過不斷的奮戰和努力終於出來了第一個洞,以下是相關步驟詳情,請各位大佬批評指正:這個CMS是PHP採用路由方式開發,前期總是找不到類和函數的調用地方,找了兩天才有所發掘,找到sys/apps
  • 二.PHP代碼審計涉及到的超全局變量
    · 出品|安全幫(www.secbang.com)概述:安全幫專注安全教育大牛繞過 針對零基礎小白【本章目的】掌握代碼審計中常用的代碼調試函數修改tets.php代碼,定義了一個名為test()的函數,賦值局部變量$xipu的值為simple,「echo $GLOBALS[『secbang』]」語句由於使用了$GLOBALS($GLOBALS['var']是外部的全局變量本身),故輸出的是test()函數之外定義的全局變量,即$secbang = "secbanger";,所以輸出secbanger。
  • 【代碼審計】PHP代碼審計之CTF系列(2)
    PS:接上篇PHP代碼審計之CTF系列(1)challenge 9訪問頁面,查看源碼<?,php://stdin,php://memory和php://temp需要allow_url_include=On)說明:訪問IO流用法:php://input 可以訪問請求的原始數據的只讀流,將post請求中的數據作為php代碼執行。
  • PHP代碼審計之----任意文件操作
    php代碼審計中和文件相關的操作主要包含如下幾種:文件包含: include/require
  • 代碼審計入門實戰
    RIPS工具的使用參考下面的實驗:實驗地址留言或私信獲取哦學習了代碼審計的常用工具,相信大家會對代碼審計的方法和步驟有一定的了解,那麼接下來簡單總結一下代碼審計的流程:① 通讀全文代碼:更好地了解程序的架構及業務邏輯,挖掘更多高質量的漏洞;
  • PHP代碼審計Day1 - in_array函數缺陷
    本文轉載自 先知社區:https://xz.aliyun.com/t/2451經紅日安全審計小組授權。
  • PHP代碼審計中常用代碼調試函數與注釋
    出品|安全幫(www.secbang.com)概述:安全幫專注安全教育【本章目的】掌握代碼審計中常用的代碼調試函數
  • PHP代碼審計四
    通常結合程序的其它漏洞實現完整的攻擊,比如文件上傳頁面,覆蓋掉原來白名單的列表,導致任意文件上傳;用戶註冊頁面控制沒覆蓋的未初始化變量導致SQL思路$$extract()函數parse_str()函數執行import_request_variables()函數如下代碼
  • 【作者投稿】PHP代碼審計-sprintf函數中的安全問題
    > 新媒體管家看到一篇WorldPress注入漏洞分析,其中sprintf單引號逃逸的思路很巧妙,在此對這類函數做一些簡單的測試和總結
  • 【代碼審計】PHP代碼審計之CTF系列(3)
    phpif(isset($_GET) && !empty($_GET)){ $url = $_GET['file']; $path = 'upload/'.payload:http://127.0.0.1/ctf/1.php?file=http://127.0.0.1//ctf/1.php?
  • 代碼審計難?掌握這個學習思路,穩贏!
    代碼審計指的是對原始碼進行檢查,尋找代碼中的Bug和安全缺陷,分析並找到這些問題引發的安全漏洞,提供代碼修訂措施和建議。
  • 【陳年舊文】PHP SECURITY CALENDAR2017 代碼審計(一)
    class_exists ( string $class_name [, bool $autoload = true ] ) : bool 檢查類是否已經定義 當第二個參數autoload為true(默認也為true)時,若class_exists檢測到類未定義則會默認調用__autoload在該處,因為class_exists默認調用
  • PHP代碼安全雜談
    考察點簡單的PHP代碼審計PHP弱類型的Hash比較缺陷write-up從源碼中可以得輸入一個a的參數的變量,a首先不等於QNKCDZO並且a得md5值必須等於QNKCDZO加密後的md5值。name[]=a&password[]=b這裡符合了2個拿到flag的條件:拿到flag: I_think_that_I_just_broke_sha1拓展總結經過驗證,不僅sha1()函數無法處理數組,這裡md5()函數也有同樣的問題,在處理數組的時候,都將返回NULL測試代碼如下:
  • 滲透文章分享(3)——代碼審計/漏洞分析
    ★★★php代碼審計/漏洞分析★★★★百家cms代碼審計https://xz.aliyun.com/t/7542★zzzcms php 1.7.5版本代碼審計初探https://xz.aliyun.com/t/7239★usual*** CMS 8.0代碼審計https://xz.aliyun.com/t/8100★MKCMS代碼審計小結
  • CTF中的PHP安全特性總結
    ;  1.2 代碼審計    此段代碼中最關鍵的函數為preg_match,根據官方文檔其作用為匹配正則表達式。/flag.php                          相對路徑  3. php://filter/resource=flag.php      php偽協議         5.1 代碼示例2.
  • XDCMS V1 代碼審計之旅
    3:訪問特定功能點,進行特定代碼審計,也就是說一個功能點看一段代碼(這裡如果出現了過濾函數,基本上可以在2中找到)審計之旅先打開首頁看看,看到有登陸框和註冊框,那就先從註冊框開始審計,查看代碼,蕪湖,沒有進行過濾,直接調用,舒服了(這裡默認後綴為.php)