본문 바로가기
3. 웹 애플리케이션 취약점 진단/Lord of Sql Injection

lord of sql injection 4번 - orc

by Robert8478 2023. 12. 21.

이제 익숙한 쿼리 구문을 바로 넣어봅니다. Hello admin이 나오네요.
그런데 코드를 보니 pw를 검증하는 구문으로 인해 실질적인 pw를 알아야 패스할 수 있을거 같네요.

우선 쿼리에 1=2라고 넣으면 Hello admin이 나오지 않네요.
즉, 거짓인 상황에서는 hello admin 메시지가 나오지 않고 참인 상황에서는 hello admin이 나오는 것이겠죠. (1=1 --+- 코드가 참이라는 뜻이니) 이런식으로 SQL 인젝션은 오류메시지를 활용해 해킹이 가능한 것입니다.

비밀번호를 알기 위해선 블라인드 sql 인젝션을 써야할거 같습니다.
substr(pw,1,1) 함수는 pw 의 1번째 글자부터 1번째 글짜까지 추출하는 것입니다.
즉, pw의 첫번째 글자를 추출하겠죠. 이것을 추출해서 ascii 코드화 시킨 후 정수값과 <,> 비교문을 사용해 비밀번호를 찾아가면 됩니다.

위에는 30보다 크다고 했을때 참인 반면 100보다 큰것은 거짓이네요.
즉, 30과 100 사이에 있는 아스키 코드 값이 첫번째 비밀번호 값이 되는겁니다.
이 30과 100을 점차 줄이거나 늘려가며 값을 찾아내는 것입니다.

그런데 실제 db 상에서 비밀번호를 찾을때에 이 비밀번호가 admin 것인지 모르기때문에
id='admin' and 구문을 앞에 넣어주어서 확실하게 admin의 pw를 찾도록 합니다.

이런식으로 < , > 부등호를 변경해도 메시지가 나오거나 나오지 않거나 하면 됩니다.

그럼 비밀번호를 찾아봅시다. 우선 50보다는 작네요.

48을 했더니 거짓이 출력되었다는것은 48보다 작지는 않다는 뜻이겠죠 그렇다면

49보다 작으면 참이라고 합니다. 즉, 49보다 작은데 48보다 작지는 않은 값은 뭘까요. 48이겠죠

그럼 48을 아스키코드표로 살펴봅니다. 48은 정수 0을 의미하는군요. 즉, 패스워드의 첫번째 글자는 0이 되는 것입니다.

그럼 이제 패스워드의 2번째 글자를 찾아야겠죠.
같은 방식으로 하되 substr에서 (pw,2,1) 즉, pw의 2번째 자리를 찾으면 됩니다.

이런식으로 쭉 찾다가 9번째 값을 보니 아스키코드가 0이 나오게 되었습니다.
아스키코드로 0은 null값을 의미하고 이는 패스워드가 총 8자리라는 뜻입니다.
그럼 지금까지 구한 패스워드 8자리를 모두 입력해주면 되겠죠.

패스워드는 095a9852 였습니다. 이를 이용해 ?pw=095a9852 를 넣어주면 클리어