문제에 접속하면 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] Level8  (0) 2017.11.01
[RedTiger] Level7  (0) 2017.11.01
[RedTiger] Level6  (0) 2017.11.01
[RedTiger] Level5  (0) 2016.10.19

[Problem]

문제를 보면 무슨 점이 찍혀있다.



소스를 확인해보면 웬 좌표값이 나열되어 있다. 이를 통해 문제를 풀어야한다.


[Scenario]

first와 second를 더하라고 했으니, 두 좌표값을 이용하여 선을 잇거나, 다른 방법을 이용해야 한다.

선을 이용해봤을때 문제를 풀긴 했으나, 이상한 점이 발견되어 write up을 찾아보니, ImageDraw 모듈의 polygon을 이용하면 정확한 값을 도출해 낼 수 있다고 하였다.


[Payload]

#coding: utf-8
from PIL import Image, ImageDraw
import sys

first = [146,399,163,403,170,393,169,391,166,386,170,381,170,371,170,355,169,346,167,335,170,329,170,320,170,310,171,301,173,290,178,289,182,287,188,286,190,286,192,291,194,296,195,305,194,307,191,312,190,316,190,321,192,331,193,338,196,341,197,346,199,352,198,360,197,366,197,373,196,380,197,383,196,387,192,389,191,392,190,396,189,400,194,401,201,402,208,403,213,402,216,401,219,397,219,393,216,390,215,385,215,379,213,373,213,365,212,360,210,353,210,347,212,338,213,329,214,319,215,311,215,306,216,296,218,290,221,283,225,282,233,284,238,287,243,290,250,291,255,294,261,293,265,291,271,291,273,289,278,287,279,285,281,280,284,278,284,276,287,277,289,283,291,286,294,291,296,295,299,300,301,304,304,320,305,327,306,332,307,341,306,349,303,354,301,364,301,371,297,375,292,384,291,386,302,393,324,391,333,387,328,375,329,367,329,353,330,341,331,328,336,319,338,310,341,304,341,285,341,278,343,269,344,262,346,259,346,251,349,259,349,264,349,273,349,280,349,288,349,295,349,298,354,293,356,286,354,279,352,268,352,257,351,249,350,234,351,211,352,197,354,185,353,171,351,154,348,147,342,137,339,132,330,122,327,120,314,116,304,117,293,118,284,118,281,122,275,128,265,129,257,131,244,133,239,134,228,136,221,137,214,138,209,135,201,132,192,130,184,131,175,129,170,131,159,134,157,134,160,130,170,125,176,114,176,102,173,103,172,108,171,111,163,115,156,116,149,117,142,116,136,115,129,115,124,115,120,115,115,117,113,120,109,122,102,122,100,121,95,121,89,115,87,110,82,109,84,118,89,123,93,129,100,130,108,132,110,133,110,136,107,138,105,140,95,138,86,141,79,149,77,155,81,162,90,165,97,167,99,171,109,171,107,161,111,156,113,170,115,185,118,208,117,223,121,239,128,251,133,259,136,266,139,276,143,290,148,310,151,332,155,348,156,353,153,366,149,379,147,394,146,399]

second = [156,141,165,135,169,131,176,130,187,134,191,140,191,146,186,150,179,155,175,157,168,157,163,157,159,157,158,164,159,175,159,181,157,191,154,197,153,205,153,210,152,212,147,215,146,218,143,220,132,220,
125,217,119,209,116,196,115,185,114,172,114,167,112,161,109,165,107,170,99,171,97,167,89,164,81,162,77,155,81,148,87,140,96,138,105,141,110,136,111,126,113,129,118,117,128,114,137,115,146,114,155,115,158,121,157,128,156,134,157,136,156,136]

with Image.open("good.jpg") as im:
    new_im = Image.new("RGB", im.size, (255,255,255))
    draw = ImageDraw.Draw(new_im)
    draw.polygon(first, fill='black')
    draw.polygon(second, fill='black')
    del draw
    new_im.save("result.jpg")

payload.py


[Result]



bull.html


'Wargame > PythonChallenge' 카테고리의 다른 글

[PythonChallenge] Level10  (3) 2017.02.15
[PythonChallenge] Level8  (2) 2017.02.15
[PythonChallenge] Level7  (2) 2017.02.14
[PythonChallenge] Level6  (2) 2016.06.28
[PythonChallenge] Level5  (2) 2016.06.27

















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

[Natas] Level11  (0) 2016.10.22
[Natas] Level10  (0) 2016.10.22
[Natas] Level8  (0) 2016.10.22
[Natas] Level7  (0) 2016.10.22
[Natas] Level6  (0) 2016.10.22

SuNiNaTaS

Web Level9(Prob_22)



9번째 문제입니다. Blind SQL Injection을 이용한 문제 풀이인데, 소스를 확인 해 보니 admin의 pw를 알아내는 것이 목표라고 합니다.


위와 같이 id에 admin'--, pw에 아무 값이나 넣어주면 pw 부분이 주석 처리 되어 바로 로그인이 가능해집니다.



이를 이용하여 and 뒤의 값을 적절히 변형시켜주면 참과 거짓일때의 반응이 다르다는 것을 알 수 있습니다.



참일때는 OK admin, 거짓일때는 false를 뱉어냅니다.



len 함수를 이용하여 pw의 길이를 확인 해 보니 10글자인 것을 알 수 있었으며



substring 함수를 이용하여 pw의 값을 한 글자씩 끊어서 판별 할 수도 있습니다.



python 스크립트를 이용하여 bruteforcing으로 키값을 알아내는 코드를 작성했습니다.



최종 값이 나오면 Auth 페이지에서 인증하면 됩니다.






References

 - Zairo(http://zairo.tistory.com/entry/SuNiNaTaS-Challenge-Level-22)

'Wargame > SuNiNaTaS' 카테고리의 다른 글

SuNiNaTaS System Level1(Prob_16)  (2) 2016.05.10
SuNiNaTaS Web Level10(Prob_23)  (141) 2016.05.10
SuNiNaTaS Web Level8  (2) 2016.05.09
SuNiNaTaS Web Level7  (2) 2016.05.09
SuNiNaTaS Web Level6  (2) 2016.05.09

OverTheWire Narnia 

[ level9 ]



OverTheWire Narnia 클리어

OverTheWire_Wargame Bandit

[ level9 -> level10 ]


자, 이제 레벨10으로 가는 마지막 관문이 남았습니다. 힌트를 확인 해 보도록 하죠.



이전 레벨과 동일하게 data.txt 안에 패스워드가 저장되어 있으며, 몇 개의 '='로 시작하는 문자열에 읽을 수 있는 문자열이 약간 있다고 합니다.

확인해봅시다!



grep으로 '==='를 필터링 하여 실행 해 보니 'Binary file (standard input) matches'라는 오류를 뱉으며 제대로 실행이 되지 않습니다.

이 오류는 바이너리 파일을 grep 했을 때 나타나는 오류라고 하는데, 이 때 -a 옵션을 주면 바이너리를 텍스트로 읽어들여 제대로 필터링 할 수 있다고 합니다.



-a 옵션을 걸어주고 grep 해 봅시다.


몇 개의 equals 뒤에 key 값이 나타난 걸 확인 할 수 있습니다.


OverTheWire_Wargame Bandit


[ level8 -> level9 ]




이번 문제는 data.txt 안에 패스워드가 저장되어 있으며, 단 한번 발생한 라인의 텍스트가 패스워드라고 합니다.

결국 이 말은 data.txt 안에는 중복되는 값이 여럿 존재하며, 이를 제거하면 단 하나의 key가 남을 것입니다.


sort와 uniq는 한 번도 사용하지 않았던 명령어라서 구글링을 통해 알아냈습니다. sort는 말 그대로 아스키 순으로 소팅을 해주는 명령어이고, uniq 함수는 중복을 제거해주는 명령어입니다. 그 중에서도 -u 옵션을 넣어주면 중복되는 값을 제거하고 남은 값을 출력해주기 때문에 key값을 바로 도출 해 낼 수 있습니다.

+ Recent posts