Lord of SQLI
시작 2018-04-27 ~
간단해보인다.
첫글이니 이것저것 설명해보자면
2. config파일을 가져온다.
3. 로그인 상태를 체크하는 것 같다. 아마 쿠키 값 유무를 체크하는 것 같다.
4. 데이터베이스에 연결한다.
5~6. prob, PROB, _(언더바), ()(소괄호), .(컴마)를 필터링 하는 것 같다. 디비 공격에 쓰이나 싶다.
7. 쿼리다. 디비에 전송할 쿼리. 여덟번째 라인은 내가 입력한 쿼리를 보여준다.
8. 내 쿼리를 그냥 echo로 띄워준다.
9. 보낸 쿼리의 DB에서의 응답 값이다.
10. 문제다. 비교를 한다.
11. highlight_file 이거는 아마 소스코드를 보여주는 것.
자 그러면 문제를 풀어보자. 정답은 DB에서 id값을 반환하면 되는 것이다.
select id from prob_gremlin where id='' and pw='' |
이 부분을 어떻게 하면 id를 반환할 수 있을까. 생각해보면 무지 간단하다.
select id from prob_gremlin where 1 |
이렇게 만들어면 된다! where 1은 TRUE에 해당하고 모든 id 값을 반환한다.
당연한 소리지만 아래의 문장은 안된다.
query : select id from prob_gremlin where id='1' and pw='1' |
id가 '1'이고 pw가 '1'인 id는 디비에 없기 때문이다.
query : select id from prob_gremlin where id='' or 1=1' and pw='' |
이렇게 해주면 어떻게 될까?
query : select id from prob_gremlin where id='' or 1=1' and pw='' |
빨간색 부분에 해당하는 값은 or 연산을 통해 TRUE가 된다. 그러면 where 1을 만족해준다.
하지만 뒤의 ' and pw='' 문장을 없애주거나 저것도 TRUE 값을 만들어 주어야 한다.
다른 방법도 있겠지만 가장 간단히 주석 처리를 통해 해결할 수 있겠다.
query : select id from prob_gremlin where id='' or 1=1#' and pw='' |
이렇게 하면 문제가 해결된다.
파라미터에 전달할 때는 #이 아닌 #의 URL ENCODE 값인 %23을 넣어야 한다.
'computer > web hacking' 카테고리의 다른 글
[LOS] prob_darkelf (0) | 2018.04.28 |
---|---|
[LOS] prob_wolfman (0) | 2018.04.28 |
[LOS] prob_orc (0) | 2018.04.28 |
[LOS] prob_goblin (0) | 2018.04.27 |
[LOS] prob_cobolt (0) | 2018.04.27 |