페이지에 접속해보면 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



user 파라미터(integer)를 입력받아 Username과 Email을 출력해준다.


?user[]=1과 같이 입력해주면 mysql_real_escape_string() 함수를 사용하는 것을 확인 할 수 있다. 따라서 single quotation과 같은 특수문자는 사용이 불가하다.


하지만 integer 기반 쿼리이기 때문에 single quotation 없이 SQLi가 가능하며, union select 구문을 사용할 수 있다.


또한 like와 parentheses 등 주요 기능이 필터링 되어 있다.


union을 사용하다 보면 2번째 컬럼에서 username의 이름을 넣어주면 쿼리가 정상 동작하는 것을 알 수 있다.


여기서 username 컬럼에 deddlef를 hex encoding 하여 보내줘도 동일한 결과가 출력되는 것을 알 수 있으며, deddlef'는 에러가, deddlef'#는 에러가 발생하지 않는 것을 확인 할 수 있었다.


여기서 출력되는 쿼리의 결과에서 username 부분을 새로운 쿼리에 넣어 실행, 결과를 출력하는 것이라 예상 할 수 있으며 exploit code를 hex encoding 하여 보내주면 패스워드를 얻어낼 수 있다.

'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

+ Recent posts