안녕하세요.

이번엔 webhacking.kr 7번 문제의 풀이를 작성하겠습니다.


7번 문제에 접속하시면 다음과 같은 화면이 나옵니다.




auth를 눌러보면 Access_Denied! 라고 alert가 표시됩니다.

소스보기를 보면


admin mode: val=2

라고 주석처리가 되어있습니다.


주소창을 보면

val=1 로 접속이 되어있는데,

val=2 로 바꾸어 보면

Access Denied 를 표시해줍니다.


일단 소스를 보져

index.phps 에 들어가줍니다.






위와 같은 소스를 볼 수 있습니다.
보게되면

'db에는 val=2가 존재하지 않습니다. union을 이용하세요.'
라고 표시되어있습니다.

즉 Union Based SQL Injection을 통해 val 에 해당하는 부분에 2가 들어가게 하여
풀이해야합니다.

필터링 리스트를 보면
'/' '*' 를 지워서 공백처리를 막고,
--, 2, 50, +, substring, from, infor, mation, lv, %20, =, !, <>, sysM, and, or, table, column, ' '
를 막고 있습니다.

일단 공백을 모두 막고있고
and나 or.
그리고 우리가 삽입해야하는 정수 2
주석처리에 필요한 --
등을 막고있습니다.

그리고 우리가 삽입해야하는 SQL 구문 부분을 보면

select lv from lv1 where lv=$go
인데.
재밌는건, 1~5 까지 랜덤수를 생성하여
입력값을 () 로 감싸는걸 볼 수 있습니다.

그럼 일단
select lv from lv1 where lv=($go)
구문에서 SQL Injection을 완성하고
rand 가 1이 될때까지 새로고침하는 방법으로 해보도록 하겠습니다.

 select lv from lv1 where lv=(0)%0aunion%0aselect%0a3-1%23)

라는 구문을 작성하였습니다.

일단 0을 넣어서 빈 결과를 만든 후

괄호를 닫아줍니다.

그리고 공백처리가 필터링 되긴 하지만

%0a (개행)은 막히지 않았으므로 우회할 수 있습니다.


그 상태에서 union select 를 넣고 우리가 넣어야하는 2 라는 결과가 나오게 해야하는데.

정수 2 자체는 필터링 되고, + 도 필터링 되므로 3-1 을 넣어 2가 되게 만들어줍니다.

그리고 뒤에 ) 가 남으니 주석을 해주어야 하는데.

-- 주석은 막혀있으니 또 다른 주석인 #(%23)를 넣어 주석처리 해줍니다.


그러면

Query 결과로는 2가 나오고 해당 문제는 클리어 할 수 있습니다.


위의 페이로드를 넣었는데 'nice try' 라고 표시된다면

rand 값이 1이 아닌 값이 나온 것이니

새로고침하여 계속 시도해주시다 보면

rand 값이 1이 될때 해당 문제를 해결하게됩니다.









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

[Webhacking.kr] All Clear  (0) 2015.08.06
[Webhacking.kr] Challenge 9  (5) 2015.08.05
[Webhacking.kr] Challenge 7  (0) 2014.10.07
[Webhacking.kr] Challenge 6  (0) 2014.10.07
[Webhacking.kr] Challenge 5  (0) 2014.07.10
[Webhacking.kr] Challenge 4  (0) 2014.07.10

티스토리 툴바