轉載自個人博客:super.j的博客
0x00 view_source
題目描述:X老師讓小寧同學查看一個網頁的源代碼,但小寧同學發現鼠標右鍵好像不管用了。
直接打開網站,F12
查看源代碼,發現flag
:cyberpeace{d54ad4fdb3a258685cbd1fd82817c5a5}
。
0x01 robots
題目描述:X老師上課講了Robots協議,小寧同學卻上課打了瞌睡,趕緊來教教小寧Robots協議是什麼吧。
分析描述,可以知道存在robots.txt
文件,打開發現
可知道有文件flag_ls_h3re.php
,直接打開該文件得到flag
:cyberpeace{165ec629b3fbc11e0b229a9a3c7283a6}
。
0x02 backup
題目描述:X老師忘記刪除備份文件,他派小寧同學去把備份文件找出來,一起來幫小寧同學吧!
分析描述:php的備份文件有兩種:*.php~
和*.php.bak
。
分別打開這兩個文件,可以下載到index.php.bak
文件,打開找到flag
。
<html>
<head>
<meta charset="UTF-8">
<title>備份文件</title>
<link href="http://libs.baidu.com/bootstrap/3.0.3/css/bootstrap.min.css" rel="stylesheet" />
<style>
body{
margin-left:auto;
margin-right:auto;
margin-TOP:200PX;
width:20em;
}
</style>
</head>
<body>
<h3>你知道index.php的備份文件名嗎?</h3>
<?php
$flag="Cyberpeace{855A1C4B3401294CB6604CCC98BDE334}"
?>
</body>
</html>
0x03 cookie
題目描述:X老師告訴小寧他在cookie裏放了些東西,小寧疑惑地想:‘這是夾心餅乾的意思嗎?’
分析描述,發現這道題目是要找cookie。訪問靶機,F12
在network中查看response
頭。
發現Set-Cookie: look-here=cookie.php
,因此我們訪問cookie.php
。讓我們查看response
。找到flag
:cyberpeace{1b0103c4937fa3d11fc2d535cd5836bd}
。
0x04 disabled_button
題目描述:X老師今天上課講了前端知識,然後給了大家一個不能按的按鈕,小寧驚奇地發現這個按鈕按不下去,到底怎麼才能按下去呢?
打開目標網頁,f12
打開源代碼發現:
<input disabled="" class="btn btn-default" style="height:50px;width:200px;" type="submit" value="flag" name="auth">
將disabled屬性刪除後,發現按鈕可以點擊,獲取flag
:cyberpeace{6c7f92cbdd9571b6cf10ffb26846022f}
。
0x05 weak_auth
題目描述:小寧寫了一個登陸驗證頁面,隨手就設了一個密碼。
打開網頁,發現是一個登錄頁面,結合描述,認爲是弱口令。
# 第一次測試
username = 111
password = 111
# 返回信息:please login as admin
#第二次測試
username = admin
password = admin
# 返回信息:password error
現在,我們可以確定賬戶爲admin
。
現在我們可以通過弱口令工具爆破該密碼。
具體的使用方法該工具的README.md
中有,這裏不再贅述。
跑出來,發現賬號密碼爲:admin/123456
。登錄,得到flag:cyberpeace{10d2ccedf1e3b82ef0e773e776e81386}
。
0x06 simple_php
題目描述:小寧聽說php是最好的語言,於是她簡單學習之後寫了幾行php代碼。
打開網頁發現php源碼,$a
和$b
是通過$_GET[]
得到的,所以可以在url中構造參數。
分析該題是php弱類型比較,a==0
返回真,輸出$flag1
,4444a
繞過is_numeric
,並且大於1234,輸出$flag2
,得到flag:Cyberpeace{647E37C7627CC3E4019EC69324F66C7C}
。
0x07 get_post
題目描述:X老師告訴小寧同學HTTP通常使用兩種請求方法,你知道是哪兩種嗎?
首先,明白兩種提交方式:GET和POST。
GET方法提交時,參數會直接跟在url後面,例如:www.xxx.com/?a=1&b=2&c=3
各參數用&
連接。
POST方法提交時,參數不會出現在url中,而是會以鍵值對的方式跟在請求頭後面。
打開網頁,提示以GET方式提交變量a,值爲1,因此在url後添加?a=1
。之後提示以POST請求提交變量b,值爲2,這時通過chrome插件hackbar
以POST方式提交b=2的請求,獲取flag:cyberpeace{dbbf28d1d2855295e7e749e836df3f6e}
。
0x08 xff_referer
題目描述:X老師告訴小寧其實xff和referer是可以僞造的。
首先要明白xff和referer。
xff:x-forwarded-for,用來識別通過HTTP代理或負載均衡方式連接到Web服務器的客戶端最原始的IP地址的HTTP請求頭字段。
referer:告訴服務器該網頁是從哪個頁面鏈接過來的。
打開網頁,提示IP地址必須爲123.123.123.123,因此在請求頭中添加x-forwarded-for:123.123.123.123。提交請求,提示必須來自https://www.google.com
,因此請求頭中添加referee:https://www.google.com
,得到flag:cyberpeace{b6aaf4c55f9cf5644e135c3b47a2f8d7}
。
本題通過chrome插件modheader
實現對http header的修改。
0x09 webshell
題目描述:小寧百度了php一句話,覺着很有意思,並且把它放在index.php裏。
由題目可知,已經有了一句話木馬了,現在只需要會連接就可以。
可以用蟻劍連接,這裏不介紹具體用法。
我們這裏用chrome插件hackbar
提交POST請求獲取flag。
flag:cyberpeace{fc2722f9d8c0a4ab3f099176c486ac61}
0x10 command_execution
題目描述:小寧寫了個ping功能,但沒有寫waf,X老師告訴她這是非常危險的,你知道爲什麼嗎。
打開網頁發現可以直接執行命令,通過;
可以執行多個命令。
# 首先找到flag.txt文件的位置
;find / -name flag.txt
# 返回:/home/flag.txt
# 查看flag.txt內容
;cat /home/flag.txt
# 返回:cyberpeace{f48d4d8ec8bc8697ab114c130789493f}
0x11 simple_js
題目描述:小寧發現了一個網頁,但卻一直輸不對密碼。(Flag格式爲 Cyberpeace{xxxxxxxxx} )
打開網頁,F12
打開源碼,發現js源碼。
function dechiffre(pass_enc){
var pass = "70,65,85,88,32,80,65,83,83,87,79,82,68,32,72,65,72,65";
var tab = pass_enc.split(',');
var tab2 = pass.split(',');
var i,j,k,l=0,m,n,o,p = "";
i = 0;
j = tab.length;
k = j + (l) + (n=0);
n = tab2.length;
for(i = (o=0); i < (k = j = n); i++ ){
o = tab[i-l];
p += String.fromCharCode((o = tab2[i]));
if(i == 5)
break;
}
for(i = (o=0); i < (k = j = n); i++ ){
o = tab[i-l];
if(i > 5 && i < k-1)
p += String.fromCharCode((o = tab2[i]));
}
p += String.fromCharCode(tab2[17]);
pass = p;return pass;
}
String["fromCharCode"](dechiffre("\x35\x35\x2c\x35\x36\x2c\x35\x34\x2c\x37\x39\x2c\x31\x31\x35\x2c\x36\x39\x2c\x31\x31\x34\x2c\x31\x31\x36\x2c\x31\x30\x37\x2c\x34\x39\x2c\x35\x30"));
h = window.prompt('Enter password');
alert( dechiffre(h) );
該題爲js代碼審計,簡化上面的代碼可得:
function dechiffre(pass_enc){
var pass = "70,65,85,88,32,80,65,83,83,87,79,82,68,32,72,65,72,65";
var tab = pass_enc.split(',');
var tab2 = pass.split(',');
var i,j,k,l=0,m,n,o,p = "";
i = 0;
n = tab2.length;
for(i = 0; i < n; i++ ){
p += String.fromCharCode(tab2[i]);
}
p += String.fromCharCode(tab2[17]);
pass = p;return pass;
}
String["fromCharCode"](dechiffre("\x35\x35\x2c\x35\x36\x2c\x35\x34\x2c\x37\x39\x2c\x31\x31\x35\x2c\x36\x39\x2c\x31\x31\x34\x2c\x31\x31\x36\x2c\x31\x30\x37\x2c\x34\x39\x2c\x35\x30"));
h = window.prompt('Enter password');
alert( dechiffre(h) );
可以發現無論輸入什麼,最後返回的值永遠都是tab2,也就是pass處理後的值,而真正的flag是\x35\x35\x2c\x35\x36\x2c\x35\x34\x2c\x37\x39\x2c\x31\x31\x35\x2c\x36\x39\x2c\x31\x31\x34\x2c\x31\x31\x36\x2c\x31\x30\x37\x2c\x34\x39\x2c\x35\x30
。通過腳本跑出flag
。
a = '\x35\x35\x2c\x35\x36\x2c\x35\x34\x2c\x37\x39\x2c\x31\x31\x35\x2c\x36\x39\x2c\x31\x31\x34\x2c\x31\x31\x36\x2c\x31\x30\x37\x2c\x34\x39\x2c\x35\x30'
# print(a)
flag = ''
a = a.split(',')
for i in a:
flag += chr(int(i))
print(flag)
flag:Cyberpeace{786OsErtk12}
後記
若有web大佬看見,有任何建議都可以相互交流一下,江小白在這裏拜謝。