2021. 8. 18. 16:12ㆍLayer7/Layer7_Web Hacking
Dreamhack - simple_sqli
POST로 userid와 userpassword를 파라미터로 받는다.
userid가 admin이면 플래그를 리턴해 준다.
따라서 userid로 admin"--를 주게 되면 admin이 쿼리문이 다음과 같이 구성이 된다:
select * from users where userid="admin"--"and userpassword="123"
userpassword 부분이 주석 처리되므로 userpassword에 아무 값이나 넣는다.
프록시로 로그인 요청을 잡은 뒤 위와 같이 파라미터를 변조한다.
플래그가 나오는 것을 볼 수 있다.
Lord of SQLI - Vampire
str_replace 함수의 취약점을 이용한 문제다.
admin이라는 스트링이 발견되면 ""로 치환을 해주긴 하나, 재귀적으로 실행되지 않는다. (non-recursively)
따라서 adadminmin와 같이 입력하면 admin이 하나가 지워지면서 남은 문자들로 또다시 admin을 이루게 된다.
따라서 파라미터로 ?id=adadminmin과 같이 주면 중간에 있는 admin이 치환됨으로써 새로운 admin 스트링이 만들어지고 결국 admin으로 인식되어 문제가 풀린다.
Lord of SQLI - Skeleton
쿼리문의 뒤에는 and 1=0이라는 조건이 있는데 이는 항상 False가 되므로 무조건 주석 처리해야 한다.
또한 id에 이미 guest가 들어간 상태인데, pw 파라미터를 잘 변조해서 where id='guest' and pw= 부분이 항상 거짓이 되게 만든다.
pw에 아무 값이나 넣은 뒤 or로 연결하여 id가 admin인 사용자를 select 하게 만든다.
where id='guest' and pw='1' or id='admin'-- -' and 1=0
주석처리를 함으로써 and 부분은 실행되지 않고 id가 admin인 사용자를 select 할 수 있어 문제가 풀린다.
Lord of SQLI - Golem
소스 코드는 위와 같이 작성되었다. pw에서 이스케이프를 한 뒤 OR ( || )로 뒤에 이어지는 내용을 같이 실행시킬 수 있다.
pw=' || ascii(substring(id, 1, 1)) like 97 && ascii(substring(pw, i, 1)) like j-- -
'로 이스케이프 한 다음 서버 사이드에서 id라는 변수에 접근하기 위해 substring() 함수를 사용한다.
id에서 1번째 1바이트를 가져와서 ASCII로 변환한다. =를 필터링하고 있기 때문에 이와 같은 역할을 하는 명령어인 like를 사용한다.
id에서 첫 번째 문자가 a로 시작하면 admin일 가능성이 크다. 이때 admin의 비밀번호를 알아내기 위한 것이므로 id는 admin이면서 패스워드를 알아내야 한다.
이때 비밀번호에서 몇 번째 문자를 브루트 포싱하고 있는 것인지는 i 변수, 그리고 어떤 문자인지 알아내기 위한 것은 j 변수이다.
즉, 비밀번호의 길이인 8만큼 바깥 i for문을 돌면서 안쪽 j for문은 그 i번째 문자 하나하나를 무차별 대입한다. ASCII 값으로 32부터 128번째까지 대입하며, ascii(substring(pw, i, 1)) like j가 성립하는 것은 비밀번호의 i번째 문자는 j를 ASCII로 변환한 것과 같은 것이다.
AND 연산자로 두 조건을 이었기 때문에 ascii(substring(id, 1, 1)) like 97라는 첫 번째 조건은 항상 참이 될 것이고
ascii(substring(pw, i, 1)) like j라는 두 번째 조건은 대입하는 문자(j) 값에 따라 참/거짓이 나뉘게 될 것이다.
만약 둘 다 성립하여 Hello admin라는 글이 페이지에 표시된다는 것은, 대입한 j 값이 올바른 값이었던 것이다.
따라서 둘 다 성립하여 참이 리턴된다면 그때의 j 값을 pw라는 문자열에 저장한 뒤 마지막에 출력해 준다.
break를 함으로써 j for문에서 남은 불필요한 반복을 건너뛰고 바로 i를 증가시켜 다음 문자를 브루트 포싱하기 시작한다.
작성한 페이로드는 다음과 같다.
공격 코드를 실행시키면 다음과 같이 패스워드가 나오고, 이를 인증하면 문제가 풀린다.
메인 사진 출처: Unsplash
© 남찬우, 2021
'Layer7 > Layer7_Web Hacking' 카테고리의 다른 글
SQL Injection II (0) | 2021.08.29 |
---|---|
JavaScript, PHP (0) | 2021.08.27 |
SSRF, HTTP Request Smuggling (0) | 2021.08.23 |
XSS, CSRF, Command Injection (0) | 2021.08.11 |
Proxy, Cookie (0) | 2021.08.09 |