syurhia 님의 블로그
Blind SQL injection with conditional erros 본문
이번에는 'Welcome Back!"과 같이 출력해주는 것도 없어서, 에러가 뜨는지 안 뜨는지를 이용해서 administator의 password를 찾아내는 방법이다.
참고로 에러가 떴을 때는, 응답 status code가 500이 나온다.
흔히 보는 404 error가 있지 않은가. 그것과 같은 느낌이다.

취약점은 있다는데 뭘 어떻게 해야 할지 그림 1만으로는 감이 안 온다.만, TrackingId라는 쿠키에 취약점이 있다고 친절하게 가르쳐줬다. 심지어 플러스로 users라는 테이블을 쓰며 password,username이라는 column을 사용한다고까지 알려줬다. 친절해라.

그러면 TrackingId쿠키에 실제로 SQL injection취약점이 존재할지 확인해보자.
쿠키에 AND를 이용하고 쿼리를 작성해준다.
아래의 쿼리를 그림 2와 같이 추가하면 에러가 나야 한다.
상식적으로 1/0을 문자열로 바꾼다는게 말이나 되는가. 여기서 에러가 발생할 수 밖에 없고, 그런 에러를 status code 500으로 돌려주는 것이다. 참고로 500은 내부 서버 오류이다. 문법적으로 말도 안되는 오류가 발생해서 이런 코드를 돌려주는 것이다. 오류문을 유저에게 돌려줄 수는 없는 노릇이니 말이다.
' AND (SELECT CASE WHEN (1=1) THEN TO_CHAR(1/0) ELSE 'a' END FROM dual) ='a'--
이번엔 아래와 같이 오류가 안 날법한 쿼리를 넣어보자.
그러면 이번에는 아무 문제 없이 응답이 돌아온다.
' AND (SELECT CASE WHEN (1=2) THEN TO_CHAR(1/0) ELSE 'a' END FROM dual) ='a'--

' AND (SELECT CASE WHEN (1=1) THEN TO_CHAR(1/0) ELSE 'a' END FROM dual) ='a'--
를 넣었을 때 서버의 response status code이다. 500이 떴다. 이것을 통해 쿠키에다가 쿼리를 내 맘대로 넣을 수 있는 게 확인이 되었고, 취약점이 존재한다는 걸 알 수 있다.

이번에는 Burp Suite를 쓰기 싫어서 파이썬으로 코드를 짜서 실행시켰다.
코드는 맨 아래에 깃허브 주소를 써놓겠다. tree구조로 찾았으면 더 빨랐을텐데.
쿼리는 아래와 같은 쿼리를 통해 password의 문자 갯수를 확인하였다. {i}에 숫자를 하나씩 넣어서 확인해도 되지만, 그러면 좀 느리니 >와 <를 이용해서 범위로 축약해 가는 게 훨씬 빠르다.
참고로, OjdYui1uvRFFuSZg는 이번에 나의 TrackingId쿠키 값이다. 별로 중요하진 않다.
OjdYui1uvRFFuSZg' AND (SELECT CASE WHEN LENGTH((SELECT password FROM users WHERE username='administrator'))={i} THEN TO_CHAR(1/0) ELSE 'a' END FROM dual) ='a'--
그리고 password에서 문자를 하나씩 추출한 것은 아래의 쿼리를 이용했다. {char}에서 문자를 하나씩 대입하는 걸로 비밀번호를 하나씩 추출한다. 그런데, 이것보단 Tree구조가 훨씬 빠르다. 이 때는, 그냥 Burp Suite를 안 쓰고 내가 직접 짠다는 마음에 Tree구조를 쓸 생각을 못 해서 스크립트가 실행되고 최종 비밀번호를 출력하기까지 시간이 좀 걸렸다.
OjdYui1uvRFFuSZg' AND (SELECT CASE WHEN SUBSTR((SELECT password FROM users WHERE username='administrator'),{i},1)='{char}' THEN TO_CHAR(1/0) ELSE 'a' END FROM dual) ='a'--

어쨌든 출력된 비밀번호를 administrator로 로그인해보자.
그림 5와 같이 성공했다.
아래 접은 글에 깃헙 주소
'보안관련 > PortSwigger' 카테고리의 다른 글
| Blind SQL injection with time delays and information retrieval (0) | 2026.05.06 |
|---|---|
| Visible error-based SQL injection (0) | 2026.04.30 |
| SQL Injection 순서 정리 (0) | 2026.04.28 |
| PortSwigger Blind SQL injection with conditional responses (0) | 2026.04.27 |
| PortSwigger SQL injection attack, listing the database contents on non-Oracle databases (0) | 2026.04.27 |