#研究對象
PHP代碼漏洞(代碼問題)
#知識點:
1、過濾函數(shù)缺陷繞過
2、CTF 考點與代碼審計
一、原理-缺陷函數(shù)-使用講解-本地
內(nèi)置函數(shù):
大部分是比較函數(shù)(過濾時使用的函數(shù))
(1)、==與=== :
參考:
PHP 淺談 == 和=== 中,數(shù)字和字符串比較的問題。_php 數(shù)字==字符串-CSDN博客
a.==:只數(shù)值比較,判斷不能成為唯一性
數(shù)字和字符串進行比較時,當(dāng)這個字符串是一個無法轉(zhuǎn)換為數(shù)字的字符串,它就會被強制轉(zhuǎn)化為數(shù)字,結(jié)果總是為0?
如a=0;b='admin'——a==b——》True
而a=1;b='1admin'——b里的admin無法轉(zhuǎn)換為數(shù)字所以為0,又和1組合最后b的值為1
所以a==b
b.===:數(shù)值和類型都比較,具有唯一性
(2)、md5 :
a.使用==的缺陷
代碼邏輯是:當(dāng)name和password收入的值不同時,進入第二個條件:name的md5加密后的數(shù)==比較passwordmd5加密后的數(shù),如果相等,則輸出flag
輸入name=QNKCDZO和password=240610708
解析
QNKCDZO以MD5加密:0e830400451993494058024219903391
240610708以MD5加密:0e462097431906509019562988736854
又已知是用”==”進行的比較,所以就繞過了
b.使用===的解析:
MD5數(shù)組判斷不了數(shù)組,會返回null
===唯一性比較,所以我們使用數(shù)組的方式
name[]=1&password[]=2
代碼會收到兩個null,故判斷正確。輸出flag
(3)、intval :
獲取數(shù)值的整數(shù)型(默認十進制。)
如果base為0,則通過字符串的格式進行檢測
輸入的字符串如以0開頭,則會被轉(zhuǎn)換為八進制;
????????????如以0x開頭,則以十六進制轉(zhuǎn)換;
(4)、strpos :strpos(string,find,start)
string是被檢查的字符串,find是要被搜索的字符串,start是開始檢索的位置,從0開始
查找字符串第一次出現(xiàn)的位置,區(qū)分大小寫
可以通過換行進行繞過:%0a666
%0a:表示換行
也可以在有必要的條件下使用 數(shù)組 返回null
(5)、in_array :
搜索數(shù)組中的特定值:第三個參數(shù),可選,如果設(shè)為True,則函數(shù)檢查搜索的數(shù)據(jù)與數(shù)組的值的類型是否相同(類似===)
第三個參數(shù)作為缺陷:
(6)、preg_match :
正則表達式:執(zhí)行匹配數(shù)據(jù),第一個參數(shù):只能匹配字符串
代碼邏輯:獲取到一個num值,匹配num值中是否有0-9的字符,有就die并輸出nonono,反之出來,進入下一個條件:num為整數(shù)即可
缺陷:有函數(shù)性質(zhì)可得,第一個參數(shù)只接受字符串,所以輸入一個數(shù)組即可
(7)、str_replace :Sql過濾
將第一參數(shù),轉(zhuǎn)換為第二參數(shù)值;無法迭代循環(huán)。即只能一次性過濾
缺陷:
大小寫和雙寫
二、實踐-CTFShow-PHP 特性-89 關(guān)卡
1.
由題得輸入num[]=1的形式即可
2.
第一個判斷不能為4476
第二個為取整之后判斷需要為4476
得知intval函數(shù)的base為0,所以需要進制轉(zhuǎn)換區(qū)觸發(fā)flag
輸入八進制:010574
輸入十六進制:0x117c
3.
查看相關(guān)preg_match里的參數(shù)/^php$/im:前面內(nèi)容不管,只要是內(nèi)容有php,$/im:代表/i(區(qū)分大小寫)、/m(是否換行匹配)
代碼邏輯就是:第一個是帶了/m的也就是要查是否有換行;第二個是不帶的,而我們是要進else拿flag的,所以
輸入cmd=%0aphp
4.
這題和上面的區(qū)別就是這里是==
所以要去輸出flag的話
輸出4476djakljskl——都可以主要不要進第一個if
5.
這題就是將num中有英文的進行過濾了
所以可以
輸出4467.1
6.
這題加了個strpos,是尋找字符串的第一個匹配字符,而且最后一個條件中是===,故要考慮值和類型完全相等的狀況,又因為,它用了preg_match和strpos,使八進制和十六進制不能用;
可以用:4476.0
?????????????? 4476.1
???????空格010574
7.
這題的preg_match多了個過濾.
所以輸出 空格010574
8.
這題就是==,輸入flag.php的文件,不讓它等于flag.php,進else里,將輸入值打??;
為了讓文件能夠完美的輸出來,可以用路徑在代替
輸入:./flag.php
如果這個操作系統(tǒng)為windows,Linux就不行
也可以:flag.php.
9.
===類型和數(shù)值都相等,函數(shù)使MD5,所以用數(shù)組,同時還是POST接收
輸入:A[]=1&b[]=2
三、實踐-代碼審計-過濾缺陷-文件讀取
源碼中的replace發(fā)現(xiàn)可以進行繞過
所以由于這個是個對象,去看誰把它給調(diào)用了
同時要考慮源文件中的if條件,進行訪問
得知它是以圖像的形式,所以正常的界面是訪問不到的,因此我們使用bp
在原文件中加上echo $dir;進行安全測試
讀取到網(wǎng)站的管理員賬號和密碼
文章來源:http://www.zghlxwxcb.cn/news/detail-804817.html
補:路徑中的/ \都是可以的文章來源地址http://www.zghlxwxcb.cn/news/detail-804817.html
到了這里,關(guān)于小迪安全20WEB 攻防-PHP 特性&缺陷對比函數(shù)&CTF 考點&CMS 審計實例的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!