김승현

[Lord Of SQLInjection] orc 4번 문제 write up 본문

Web/Lord Of Sql

[Lord Of SQLInjection] orc 4번 문제 write up

kshind 2023. 3. 12. 17:16

문제

문제는 이렇게 되어 있고 그냥 admin이 id로 입력되어 있고 pw에만 쿼리를 입력해서

sqli를 성공시키는 문제인 것 같다.

쿼리문을 확인해보면

select id from prob_orc where id='admin' and pw='{$_GET[pw]}'

이렇게 생겼다. pw에 적당한 값을 입력해보자.

이런 식으로 id가 admin이면 되게 했는데 Hello admin는 떴지만 orc clear! 가 뜨지 않았다.

if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("orc");

자세히 코드를 보면 위의 내용을 볼 수 있는데 result의 pw가 파라미터인 pw와 동일해야지 문제가 풀리는 방식이다.

blind sqli로 비밀번호를 한 자리 한 자리씩 알아보자.

?pw=' or id='admin' and length(pw)='[정수]

위의 쿼리문을 입력하면 pw의 길이가 우리가 입력한 정수가 일치할 때만 Hello admin을 출력할 것이다. 시도해보자.

 

7을 입력하자 아무 일도 없지만

8을 입력하니까 Hello admin이 출력된 걸 봐선 admin의 pw 길이가 8자리인 걸 알 수 있다. ascii와 substr을 이용해서

admin의 password를 구해보자.

?pw=' or id='admin' and ascii(substr(pw, 1, 1))<50 %23

위의 코드를 주소에 입력하면 pw의 첫 번째 문자가 ascii code로 50보다 작은지, 즉 2보다 작은 값인지 찾는 것이다. 

위의 코드를 조금씩 바꿔가면서 하다보면 찾을 수 있다.

hello admin이 뜨는 걸로 봐선 50보다 작은 값인 걸 알 수 있다. 더 해보자.

50에서 25로 해보고 25에서 37정도로 가보고 이런 식으로 줄이다 보면 48임을 알 수 있다. 48은 0을 의미한다.

 

두 번째 자리 pw는 57 미만에선 뜨지 않는 걸 보니 57, 즉 9를 의미한다. 이렇게 8자리 password를  하나하나

찾아보면 095a9852라는 pw가 나온다. ?pw=095a9852를 입력해보자.