1. 程式人生 > >PHP代碼審計基礎

PHP代碼審計基礎

之前 命令執行 file 一個 ssi nal arr adf nts

一、GPC

  1. 整數類型不受GPC影響
  2. $_SERVER變量不受GPC保護
  3. $_FILES變量不受GPC保護
  4. 寬字節註入
  5. 數據庫操作容易忘記添加單引號的地方如:in()/limit/order by/group by
  6. 只過濾了變量的值,但沒有過濾key(有的程序會在代碼中使用key,如帶入SQL語句)
  7. php5.3以後$_REQUEST中不再包含$_COOKIE(可能導致過濾不全)
  8. GPC為on的時候,在php4和php<5.2.1的情況下GPC不處理數組第一維變量的key
  9. 在對參數進行過濾後又對其進行了其它的操作,如substr,str_replace等,這可能導致轉義符被刪除

二、特性

函數/語法特性
in_array 比較之前會對數據進行類型轉換
is_numeric 十六進制可繞過
intval 會對字符串進行類型轉換,只要第一個字符是數字即可轉換成功
iconv 導致字符串截斷
==與=== 雙等號兩邊如果變量類型不同則會做類型轉換
` ` 反引號命令執行
“” 雙引號變量解析
$a($b) 動態函數執行
is_file 使用通配符(<,>)可繞過

三、危險函數


  • 代碼執行
  1. eval
  2. preg_replace
  3. assert
  4. call_user_func
  5. call_user_func_array
  6. create_function
  7. array_map

  • 文件包含
  1. include
  2. require
  3. require_once
  4. include_once

  • 文件讀取
  1. file_get_contents
  2. highlight_file
  3. fopen
  4. readfile
  5. fread
  6. fgetss
  7. fgets
  8. parse_ini_file
  9. show_source
  10. file()

  • 文件上傳
  1. move_uploaded_file

  • 命令執行
  1. exec
  2. system
  3. popen
  4. passthru
  5. proc_open
  6. pcntl_exec
  7. shell_exec
  8. ` `

  • 變量覆蓋
  1. $$
  2. extract
  3. parse_str
  4. mb_parse_str
  5. import_request_variables

  • 變量的編碼與解碼
  1. stripslashes
  2. base64_decode
  3. rawurldecode
  4. urldecode
  5. unserialize
  6. iconv
  7. mb_convert_encoding

  • 跨站腳本
  1. echo
  2. print
  3. printf
  4. sprintf
  5. print_f
  6. vprintf
  7. die
  8. var_dump
  9. var_export

  • 反序列化
  1. serialize
  2. unserialize
  3. __construct 構造函數
  4. __destruct 析構函數
  5. __toString 打印對象時自動調用
  6. __sleep 序列化時自動調用
  7. __wakeup 反序列化時自動調用

  • 枚舉
  1. rand 使用rand處理session時,攻擊者很容易暴力破解出session

四、閱讀技巧

  1. 從index文件讀起,了解程序運行流程
  2. 檢查程序入口處做了哪些安全處理
  3. 檢查數據庫入口處做了哪些安全處理
  4. 檢查數據庫連接處代碼
  5. 檢查登陸、註冊、找回密碼、綁定郵箱、文件管理和文件上傳等功能點
  6. 理清程序調用流程以及輸入數據的流向,這樣可以節約很多時間,可以有目的的查找漏洞

五、新技能

  1. 文件包含截斷新姿勢:http://www.hackersb.cn/hacker/105.html
      $a = $_GET[‘file‘];   include $a.‘.html.php‘;

在可以控制協議的情況下,首先新建一個hello.html.php,內容為phpinfo(),然後壓縮成zip,然後訪問http://localhost/test/blog.php?file=zip://test.zip%23hello
註意:變量名需要在開頭以控制協議

    1. 功能同上,協議更換為phar, 訪問方式為:http://localhost/test/blog.php?file=phar://1.zip/1.php

PHP代碼審計基礎