페이지에 접속해보면 Login 버튼이 존재한다. 우리의 목표는 TheMaster 계정으로 로그인 하는것이다.



Login 버튼을 눌러보면 Monkey 계정으로 로그인 된 것을 확인 할 수 있다.


        <b>Welcome to Level 10</b><br><br>
        Target: Bypass the login. Login as TheMaster<br>
        <br><br><br>
        <form method="post">
            <input type="hidden" name="login" value="YToyOntzOjg6InVzZXJuYW1lIjtzOjY6Ik1vbmtleSI7czo4OiJwYXNzd29yZCI7czoxMjoiMDgxNXBhc3N3b3JkIjt9">
            <input type="submit" value="Login" name="dologin">
        </form>
        <br><br><br>
    Welcome Monkey. You are just a normal user!



소스를 확인해보면 Login 버튼을 눌렀을 때 login 파라미터로 YToyOntzOjg6InVzZXJuYW1lIjtzOjY6Ik1vbmtleSI7czo4OiJwYXNzd29yZCI7czoxMjoiMDgxNXBhc3N3b3JkIjt9가 전달되는 것을 알 수 있다. 이를 base64 디코딩하면 a:2:{s:8:"username";s:6:"Monkey";s:8:"password";s:12:"0815password";}가 나온다. PHP Serialize 함수의 결과이기 때문에 이를 수정하여 base64로 인코딩 후 login 파라미터에 태워 보내주면 로그인 할 수 있을 것이다.



boolean 타입으로 password 변수를 지정해준 후 1을 넘겨주어 true를 반환시키면 TheMaster 계정으로 로그인 할 수 있다.

'Wargame > RedTiger:OverTheWire' 카테고리의 다른 글

[RedTiger] Level 10  (2) 2017.11.07
[RedTiger] Level 9  (0) 2017.11.06
[RedTiger] Level8  (0) 2017.11.01
[RedTiger] Level7  (0) 2017.11.01
[RedTiger] Level6  (0) 2017.11.01
  1. horensic 2017.11.11 00:09

    항상 블로그 잘 보고 있습니다. ^^

    • Choiys 2017.11.12 18:51 신고

      고려대학교 정보보호대학원 석사과정(진)님 아니십니까?


문제에 접속하면 Name과 Title, Content로 보이는 부분을 입력하는 폼이 존재한다.

SQLi가 바탕인 RedTiger 문제이기 때문에 왠지 insert 구문을 이용하여 데이터를 추가 할 것 같다.



이는 Name에 1, Title에 2, Content에 3을 입력하여 제출 했을 때의 결과이다.

mysql의 insert 구문에서는 parentheses를 필터링 하지 않을 경우 사용자의 입력값에 따라 데이터의 중복 삽입을 유발할 수 있다.

이 문제의 경우 모든 입력값에 대해 single quotation으로 묶여있는 형태인데, Name과 Title의 경우에는 single quotation을 \'로 치환하여 특수문자가 아닌 단일문자로 사용하는 반면 Content 부분에서는 이를 필터링하지 않아 string의 끝을 의미하는 quotation으로 적용된다.

mysql에서는 insert 구문 사용 시 insert into table_name values(val1,val2,val3),(val4,val5,val6),... 등으로 데이터를 중복 삽입 할 수 있다.



이를 이용하여 Content 부분에 single quotation을 포함하여 데이터를 중복 삽입하고, 데이터를 삽입하는 위치에 select 구문을 이용하여 level9_users 테이블의 username과 password를 추출해낼 수 있다.


이를 이용해 얻어낸 username과 password를 하단의 입력 폼에 넣어 요청하면 플래그를 얻을 수 있다.



'Wargame > RedTiger:OverTheWire' 카테고리의 다른 글

[RedTiger] Level 10  (2) 2017.11.07
[RedTiger] Level 9  (0) 2017.11.06
[RedTiger] Level8  (0) 2017.11.01
[RedTiger] Level7  (0) 2017.11.01
[RedTiger] Level6  (0) 2017.11.01


Level8은 admin 계정의 패스워드를 알아내라고 합니다.


Edit 버튼을 누르면 정보가 갱신되며, 이는 곧 update 구문을 이용한 것이라고 생각 할 수 있습니다.


따라서 update [table명] set [attribute1=value1, attribute2=value2, ...]의 형태이기 때문에 single quotation을 추가하여 다른 속성의 값을 중복 변경 할 수 있습니다.


single quotation만을 입력했을 때 나타나는 오류로 보아 update 구문에 적용되는 속성의 순서는 다음과 같습니다.



name, username, email, icq, age 의 순서로 update 되기 때문에 가장 먼저 나타나는 name의 속성의 값을 password로 변경한다면 Admin 계정의 패스워드를 알아낼 수 있습니다.




'Wargame > RedTiger:OverTheWire' 카테고리의 다른 글

[RedTiger] Level 10  (2) 2017.11.07
[RedTiger] Level 9  (0) 2017.11.06
[RedTiger] Level8  (0) 2017.11.01
[RedTiger] Level7  (0) 2017.11.01
[RedTiger] Level6  (0) 2017.11.01


textbox에 있는 내용은 search 파라미터를 통해 post로 전송되며, single quotation과 함께 전송하면 SQLi를 유발시킬 수 있다.


이 때 에러 메시지를 통해 쿼리문 전체를 알아낼 수 있다.


SELECT news.*,text.text,text.title FROM level7_news news, level7_texts text WHERE text.id = news.id AND (text.text LIKE '%a'%' OR text.title LIKE '%a'%')


like문에서 SQLi가 발생하며, parentheses를 열고 닫음으로 구문을 마무리 후 union을 통해 원하는 컬럼을 추출해낼 수 있다.



이 중 TestUserforg00gle이 username이 되며, 이를 입력하면 플래그를 얻을 수 있다.

'Wargame > RedTiger:OverTheWire' 카테고리의 다른 글

[RedTiger] Level 10  (2) 2017.11.07
[RedTiger] Level 9  (0) 2017.11.06
[RedTiger] Level8  (0) 2017.11.01
[RedTiger] Level7  (0) 2017.11.01
[RedTiger] Level6  (0) 2017.11.01

Wargame.kr

Web_700

ip log table




700점짜리 문제도 거의 끝나가네요. Blind SQL Injection을 이용하여 풀이하는 문제인 것 같습니다.

바로 문제를 확인 해 보도록 하죠.


문제에 접속 해 보니 상단에 admin 계정으로 로그인 할 수 있는 페이지로 접근 할 수 있는 버튼이 있고, 아래 테이블에는 idx와 함께 IP가 있습니다.

해당 테이블의 항목들을 클릭하면 아래와 같은 log time이 나타납니다.




이 log time은 문제 페이지에 접속한 당시의 서버 시간을 나타내는 것 같습니다.

그리고 Request 때리는 부분을 확인해봤더니 chk.php 페이지로 POST 요청을 날려주는데, 파라미터로 idx를 같이 날려줍니다.

이 idx가 위에서 확인했던 log time을 구별해주는 지표가 됩니다.

여기서 생각 할 수 있는것은 이 idx 파라미터가 전달 될 때 select 쿼리를 사용할텐데, 여기에 single quotation이 없는 등의 코딩 실수가 있을 경우 SQL Injection이 가능할 것입니다.



그래서 위와 같이 burp suite를 이용하여 idx 파라미터에 select문을 사용하여 table명을 알아내는 코드를 짰더니, 참과 거짓에 따라 다른 값이 나타났습니다.

(chk.php 페이지에서는 idx가 문제 페이지에 나타나있는 테이블에 존재하지 않는 경우 1970년 1월 1일자로 나타납니다.)

따라서 이를 이용하여 Blind SQL Injection을 먹일 수 있습니다.



python으로 테이블명을 알아 낼 수 있는 스크립트를 작성했습니다.

돌려보도록 하죠.



페이지 내에 sleep문이 적용되어있는지 약간 느린 반응을 보여줬습니다. 이 11글자 알아내는데 30초가 넘게 걸렸습니다...

아무튼 limit의 숫자를 늘려가며 admin_table이라는 테이블을 알아냈습니다.

이 테이블 안에 아마도 admin 계정의 id와 pw를 알아 낼 수 있는 컬럼이 있을 것입니다.



위에서 사용했던 payload.py를 복사하여 약간 내용을 수정 후 column.py로 바꾸고 컬럼 값을 찾는 스크립트를 돌려봤습니다.

이 또한 limit 값을 늘려가며 찾아보았더니 id와 ps라는 컬럼을 찾아 낼 수 있었습니다.

이제 이를 이용하여 admin 계정의 id와 pw를 알아내면 될 것 같습니다.



id는 blue_admin



pw는 0h~myp4ss!인 것을 알아냈습니다.

이제 이를 admin 페이지에 접속하여 로그인 해 보도록 하죠.






짠! flag를 찾아냈습니다.

'Wargame > Wargame.kr' 카테고리의 다른 글

[Wargame.kr] Web_888_zairo  (8) 2016.09.20
[Wargame.kr] Web_700_php? c?  (0) 2016.05.27
[Wargame.kr] Web_700_ip log table  (0) 2016.05.27
[Wargame.kr] Web_700_lonely guys  (0) 2016.05.26
[Wargame.kr] Web_700_dmbs335  (0) 2016.05.26
[Wargame.kr] Web_650_crack crack crack it  (0) 2016.05.25

Wargame.kr

Web_700

lonely guys



웹 700점짜리 lonely guys 문제입니다.

Order by SQL Injection에 관련 된 문제라고 하네요.

문제를 확인 해 봅시다.



문제에 접속 해 보니 위와 같은 웹페이지가 나타났습니다.

reg_single(sort)라고 적혀있는 볼드체를 클릭하면 asc 기준에서 desc 기준으로 재정렬이 됩니다.

별다른 힌트는 없는 것 같습니다. 소스를 확인 해 보도록 하죠.



여기서 주의깊게 볼 부분은 update 구문입니다.

flag가 들어있는 column과 table명을 적나라하게 적어주셨습니다. 우리는 이를 이용해 문제를 쉽게 풀어나갈 수 있을 것 같습니다.

그리고 아래의 select문을 확인하면 reg_date 기준으로 오름/내림차순 정렬을 하는 쿼리문을 볼 수 있습니다.

하지만 sort 변수에는 single quotation이 없기 때문에 이를 공격벡터로 이용하여 SQLi를 때릴 수 있을 것 같습니다.

명칭은 Order By Clause SQLi라고 하는 듯 합니다. 

처음에는 IF문을 이용하여 결과 값 차이를 확인 해 보려고 노력해보았으나, order by 절에서는 IF문이 먹히질 않는 것 같습니다..

따라서 Time Based Blind SQLi로 풀이하였습니다.



위와 같이 sort 파라미터를 POST로 요청하는데, select문에 sleep을 먹여 key값의 글자수를 확인하였습니다.

뭔가.. 다른 방법으로도 글자수를 확인 할 수 있을 것 같은데, 떠오르지 않아 0xf5( _ )를 하나씩 늘려가며 노가다로 찾아냈습니다.

Key값의 글자 수는 40Byte입니다.



40byte인 것을 알아냈으니, python 스크립트를 작성하여 40글자를 알아냈습니다.

Time Based이기 때문에 요청하기 이전과 이후의 시간 차를 계산하여 Key를 찾아내는 스크립트입니다.

다른 좋은 방법을 알고 계시는 분은 댓글로 부탁드립니다..(굽신)



짠!


'Wargame > Wargame.kr' 카테고리의 다른 글

[Wargame.kr] Web_700_php? c?  (0) 2016.05.27
[Wargame.kr] Web_700_ip log table  (0) 2016.05.27
[Wargame.kr] Web_700_lonely guys  (0) 2016.05.26
[Wargame.kr] Web_700_dmbs335  (0) 2016.05.26
[Wargame.kr] Web_650_crack crack crack it  (0) 2016.05.25
[Wargame.kr] Forensics_650_img recovery  (0) 2016.05.24

+ Recent posts