이번에는 id에 admin이 고정되어 있다.
$_GET[pw] = addslashes($_GET[pw]);
여기서 addslashes란? 문자 앞에 백슬래시를 붙여서 이스케이프하는 것
이 문제는 예전에 풀었던 Blind SQL injection이다. query에 내가 뭔가를 입력하면 오류메시지 대신 참/거짓으로만 뜨는걸 blind SQL inejction이라고 함.
일단 평소에 SQL injection을 공격하는것 처럼 'or '1'='1을 입력해보았다.
로그인은 잘 됨.
근데 아까 말했듯이 Blind SQL injection이라고 했으니까, 여기서 우리가 할 수 있는 것은 비밀번호를 맞추는 것.
어떻게? 유추를 해서!!
예) 처음에 우리가 pw=' or '1'='1 이렇게 해서 값을 무조건 참이 되게 해서 로그인을 했듯이, 이를 활용해서 비밀번호의 길이를 유추할 수가 있다.
pw=' or length(pw)>5%23
비밀번호 길이를 알기 위해선 length(pw)라고 입력해주면 된다.
* 그리고 뒤에 #를 써줘서 나머지는 무력화해주면 됨.
사실 작은 따옴표 부분은 나도 쓰면서 조금 헷갈림..
그럼 이렇게 정상적으로 로그인이 된 걸 알 수 있음.
아 그러면 비밀번호는 5보다는 길구나!
7까지도 정상적으로 로그인이 된다.
8부터는 정상적으로 안되는 것을 확인.
그 다음에 우리가 사용할 함수는 substr인데 Blind SQL injection에서는 진짜 자주 쓰이는 함수라 이번 문제를 통해 알아두면 좋다.
substr은 문자열의 일부를 추출해낸다고 생각하면 된다. 아마 substring이라고 써도 될 듯.
SUBSTRING('문자열', '시작지점', '길이')
substr(pw, 1, 1) 이렇게 사용하면 pw라는 변수의 1번째 글자부터 길이 1만큼의 값이 얼만지를 적는건데, 길이 1은 그냥 1번째 글자의 값이 뭔지 찾는 것이다. 그리고 우리는 이 문제를 문자열로 풀고 있으니까 아스키 코드로 변경도 해주어야 한다.
(ascii(substr(pw, 1, 1)) 이렇게!
그리고 뒤에는 우리가 유추할 아스키 코드 숫자를 입력해주면 된다. 참고로 a는 97.
일단 a는 아니다. 97에서 1씩 증가하다보면
100에서 로그인이 되는 것을 확인한다. 그러면 패스워드의 첫번째 글자는 d
근데 사실 자동화 툴 써주면 되는데,,,
파이썬을 할 줄 모른다,,,

그냥 하나하나 해도 되긴 하지만...
그리고 비밀번호보니까 한 문자 빼고 나머지는 다 숫자던데 나는 왜 때문에 첫번째 글자가 d가 나온걸까,,
이 부분은 다시 공부해서 풀이를 해야겠다.
'Web > LORD OF SQLINJECTION' 카테고리의 다른 글
LOS 6번 darkelf 문제 (0) | 2021.09.17 |
---|---|
LOS 5번 Wolfman 문제 (0) | 2021.09.16 |
LOS 3번 Goblin 문제 (0) | 2021.09.14 |
LOS 2번 Cobolt 문제 (0) | 2021.09.13 |
LOS 1번 Gremlin 문제 (0) | 2021.09.12 |
댓글