정구리의 우주정복
webhacking.kr 18번 문제 본문
sql 인젝션 알못이라서 결국 마지막에 풀이를 봐버렸기 때문에 카테고리는 study인 걸루 ..
시작하자마자 sql injection 이래서 잔뜩 쫄았다 리얼
index.phps를 봐보자
쏘쓰코드다
eregi(" |/|\(|\)|\t|\||&|union|select|from|0x",$_GET[no])) exit("no hack") 라고한다
select, , from 등등등 이런 문자들이 들어가면 종료하게 된다 !
q 에는 select id from challenge18_table where id='guest' and no=$_GET[no] 라는 쿼리가 있다
만약 no 가 guest와 일치하면 hi guest 를 반환해주고
id= admin 이고 no 가 admin꺼랑 일치하면 solve !
값을 입력하면 no 에 들어가게 되는 형태 ! 그래서 일단 1을 넣어줬다
1을 넣자 hi guest 라고 나왔다 그렇다면 테이블은
[0] [1]
guest 1
admin ?
이러한 형태로 생겼지 않았을까 ?! 하지만 다른 값을 넣어주려고 해도 이미 id에 guset값이 있기 때문에
문제 해결을 위해서는 id='guest' 부분을 무시해줘야하고 no에는 admin 의 no를 넣어줘야하는데 guest가 1이였으니 일단 2값을 넣어보고싶다 !
-----------------------------------------여기까지 생각했고 그 이후는 풀이를 봤따....(나레기조무레기)------------------------------------
해결하지 못한것 (1) id='guset'의 무시
(2) 무시한 이후에는 어떻게 할지
sql 연산의 순서는 and>or 즉 and연산이 or연산보다 먼저 이루어져야한다
따라서
select id from challenge18_table where id='guest' and no=$_GET[no] or no=2
쿼리를 이렇게 만들어주면
select id from challenge18_table where ( id='guest' and no=$_GET[no] ) ( or no=2 )
이렇게 연산이 이루어지게 되는것이다! 그렇다면 no에 1이 아닌 다른 값을 넣어주면 첫번째 연산이 실행되지 않을것이고 두번째 연산이 실행되어 (1) 이 해결되게 된다 !!
하지만 form 태그에 0 or no=2 (0자리엔 1 빼고 다 됨)라고 넣어주면 위의 eregi에 의해 프로그램이 종료가 되게 된다 따라서
공백을 우회시켜줘야한다
공백우회에는
1. \n : %0a
2. \t : %09
3. \r : %0d
4. 주석 : /**/
5. 괄호 : ()
6. 더하기 : +
이렇게 있다 하지만 eregi에 의해 막힌게 몇개 있으니 막히지않은 %0a 를 사용해서
0%0aor%0ano=2 라고 입력해주면
Clear!
'WEB HACKING > STUDY' 카테고리의 다른 글
webhacking.kr 31번 문제 (미완성) (0) | 2018.09.28 |
---|---|
extract() 함수 (0) | 2018.09.22 |
ereg, eregi 함수 (0) | 2018.09.21 |