SQL injection/lord of SQL

Lord Of SQL injection 4단계-orc

ys.k 2022. 1. 3. 22:26

LOS 포스팅에 앞서 내용이 틀릴 수도 있으며, 해당 부분 지적은 감사히 받겠습니다.

4단계 소스코드이다.

pw의 입력값은 필터링되고 있으며 이번엔 id 가 admin으로 값이 설정되어있다.

그리고 입력받은 pw 값은 addslashes 를 통해 ' , " (싱글 쿼터와 더블 쿼터) 앞에 \를 붙여준다.

해결조건은 입력받은 pw 값과 데이터 베이스 내부 pw 값이 같아야 해결이 되는 것 같다.

 

사실 여기서부터 막혀서 인터넷 검색을 좀 하고 왔더니 blind sql 을 통해 해결하는 방법이 있어 참고한다.

db 내부의 pw 값을 찾기 위하여 일단 pw 의 길이를 먼저 찾는 게 중요하다.

그리고 bling sql 을 수행하기 위해 쿼리가 db 내부까지 도달하여 참 , 거짓에 따라 차이점을 나타낼 수 있어야 하는데 

4번 문제의 경우 참이면 Hello admin 가 출력되고 거짓이면 소스코드만 뜨는 차이점이 있다.

1부터 대입하여 비밀번호는 8자리라는 것을 찾아냈다.

문제를 풀던도중 이상한 점을 발견했다. 

비밀번호의 첫번째 자릿수를 유추하려 막일 중 참이 되는 값을 찾았다.

하지만 파이썬 인젝터로 돌렸을 때랑 값이 다르게 나온다.

해당 코드로 돌렸을 때

이러한 결과값이 나오게 되는데 이는 수동 blind injection 이랑 다른 값을 나타낸다.

그리고 일단 인젝터에서 나온값으로 문제를 풀어보았다.

풀렸다.... 그러면 이게 답이 맞는 거라는데 과연 수작업에서는 어떤 오류가 생긴 걸까? 

일단 ※확실히※ admin 비밀번호를 조회하는 쿼리문을 만들어 보았더니 인젝터로 찾은값이랑 같게 나왔다.

사진엔 없지만 2번째 자리도 ascii(57) => 9 참값으로 페이지에 표시되었다.

그렇다면 admin 계정으로 조회된 비밀번호값이 아니라는 생각이 들었다. 

그래서 

찾았다. 첫자리가 아스키 코드 103 즉 g이고 guest라는 걸 추측할 수 있으며

정답.. 그렇다면 왜 쿼리문에서 id 를 자동으로 앞자리가 빠른 a가 아닌 g 가 자동선택이 되었을까 궁금하다.

또한 guest 의guest의 비밀번호를 찾아봤다. djfk 가 나와 아까 쿼리문에서 admin 이 아닌 guest의 비밀번호를 검색한 것이 확실히 맞게 되었다.

그런데....

쿼리문을 다시 작성해보니 위 사진과 다른 결과값이 나온다..... 왜 그러지..

문제를 해결했다!!!

문제의 발생원인은 내가 수동으로 blind injection을 수행할 때 있었는데

pw'or (select ascii(substr(pw,1,1)))>1 형태로 찾았었다. 하지만 쿼리에선 모든 id의 pw를 검색했었고 나는 admin의 pw 첫 번째 아스키 값인 48을 지나치고 100으로 찾았던 것이었다... 이로써 문제 해결!