代碼審計小技巧

漏洞挖掘與防範

SQL注入漏洞

1.搜索關鍵字如select from、update、insert、deletemysql_connectmysql_querymysql_fetch_now等關鍵字可定向挖掘SQL注入漏洞。php

寬字節注入

2.urlencode、urldecode、rawurlencode、rawurldecode區別。使用不當可致使寬字節注入。
除了 -_. 以外的全部非字母數字字符都將被替換成百分號(%)後跟兩位十六進制數。
urlencoderawurlencode的區別:
1)urlencode 將空格則編碼爲加號(+)
2)rawurlencode 將空格則編碼爲加號(%20)
payload:mysql

.../1.php?id=1df%' union select 1,database()#
'單引號自動轉義在前面加了/'---通過urlencode洗禮後也就是5c%
若是php鏈接數據庫的時候設置了set character_set_client=gbk,就是告訴mysql服務器 客戶端 數據來源是GBK格式
這時df%5c%會被decode成一個漢字。

寬字節注入搜索關鍵字SET NAMES、character_set_client=gbk、mysql_set_charset('gbk')sql

二次urldecode注入

payload:%2527
%25進行解碼後爲%         再次解碼%27結果爲'(單引號)

原理是當某處使用了urldecode()或者rawurldecode()函數,當咱們提交參數到WebServer的時候。WebServer會自動解碼一次。而後在通過函數的二次解碼。生成單引號引起注入。
能夠搜索這兩個函數的關鍵詞進行定位。數據庫

防範措施--函數

gpc和addslashes

若是magic_quotes_gpc=On(php6以上沒有此選項)
PHP解析器就會自動爲post、get、cookie過來的數據增長轉義字符,和函數addslashes功能差很少數組

mysql_[real_]escape_string函數

(php4.0.3版本以上才存在)
做用是轉義特殊字符,包括:安全

\x00
\n
\r
\
'
"
\x1a

intval(將變量轉換爲int類型)--主要是利用參數白名單

PDO prepare預編譯

函數

文件上傳

move_uploaded_file($temp_file, $img_path)
trim($file_name)#移除字符串兩側的空白字符或其餘預約義字符
strrchr($file_name, '.')#返回'.'在$file_name最後出現的位置到$file_name字符串末尾這一段字符串
strtolower($name)#轉換爲小寫
str_ireplace('a','',$name)#將$name中的'a'/'A'(不區分大小寫)替換成''(也就是刪除)
in_array($name,$array)#查詢$name是否在$array中
substr($string,$start,$length)#$start(0,-1),均是從左往右
strrpos($name,'.')#返回'.'在$name字符串中最後出現的位置(從0開始)

fopen($filename, "rb")#打開$filename二進制只讀模式
fread($filbit,2)#只讀兩個字節
unpack("C2chars", $bin)#將字節轉化爲字節二進制的數組
intval($strInfo['chars1'].$strInfo['chars2'])#intval函數做用是提取整數(參數包括字符串和整數)

getimagesize($filename)#檢測圖片類型,返回數組。不是絕對安全,可繞過
image_type_to_extension('int')#返回後綴名,參數範圍可參照getimagesize函數返回結果索引3
stripos($name,'.')#返回'.'在$name字符串中首次出現的位置(從0開始)

#獲取文件名後綴:
第一種方法:
strtolower(substr($_FILES[$n]["name"],strrpos($_FILES[$n]["name"],'.')+1))
第二種方法:
$uptype = explode(".",$_FILES["file"]["name"]);//獲取擴展名
$kuozm=strtolower(end($uptype));
相關文章
相關標籤/搜索