일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 웹 개발
- Los
- php
- Python
- 모의해킹
- CTF
- 게시판 만들기
- 웹 해킹
- css
- 과제
- JS
- union sql injection
- 보안 패치
- 세션
- cookie 탈취
- MySQL
- 로그인페이지
- file upload
- sql injection
- 보고서
- sql injection point
- Error based sql injection
- 증적 사진
- XSS
- lord of sql injection
- 웹개발
- 문제 풀이
- blind sql injection
- csrf
- 로그인
- Today
- Total
Almon Dev
[Lord of SQL Injection] nightmare 문제 풀이 본문
nightmare 문제 풀이
nightmare 문제
문제 분석
문제 목표
pw 파라미터를 이용해 삽입된 SQL 쿼리의 결과가 존재할 경우, solve("nightmare") 함수가 실행됩니다. 이 함수는 문제를 성공적으로 해결했을 때 호출되는 것으로 보이므로, 이 문제의 목표는 pw 파라미터를 활용해 SQL 인젝션을 성공시키는 것입니다.
$query = "select id from prob_nightmare where pw=('{$_GET[pw]}') and id!='admin'";
echo "<hr>query : <strong>{$query}</strong><hr><br>";
$result = @mysqli_fetch_array(mysqli_query($db,$query));
if($result['id']) solve("nightmare");
입력 제한
pw 파라미터는 5글자 이하로 제한되며, #, - 등 주석 문자는 필터링되고 있습니다.
if(preg_match('/prob|_|\.|\(\)|#|-/i', $_GET[pw])) exit("No Hack ~_~");
if(strlen($_GET[pw])>6) exit("No Hack ~_~");
취약점 분석
pw 파라미터의 글자수를 제한하고, 주석 문자를 필터링하였지만 우회하여 SQL Injection이 가능합니다.
우회 방법
; => SQL 쿼리의 종료를 의미합니다.
ex) select 1; select 2 => 2개의 SQL 쿼리문으로 취급됩니다.
%00 => null 문자를 url 인코딩한 것으로 PHP, C 등에서 문자열의 종료를 의미합니다.
ex) "test%00123" => "test"로 인식됩니다.
;%00 => SQL 쿼리를 ;로 끝내고 null 문자로 문자열을 조기 종료시킵니다.
ex) "select 1;%00 select 2" => select 1 까지만 실행합니다.
문제 풀이
1. ('')=0 참 쿼리를 삽입합니다.
=> SQL에서 '' = 0는 빈 문자열을 숫자 0으로 치환하여 비교하기 때문에 true가 됩니다.
2. 참 쿼리 이후의 문자가 주석처리되도록 ;%00를 삽입하여 문제풀이를 완료합니다.
=> 실제 출력된 쿼리문은 동일하지만 mysqli_query() 함수에서 null 문자 이후를 무시하여 쿼리의 where문이 참으로 종료됩니다.
;%00 테스트
mysqli_query() 함수는 한 번에 하나의 쿼리만 처리할 수 있습니다. 이때 null 문자를 삽입하지 않고 쿼리 문자열에 ; 뒤에 또 다른 구문이 포함되어 있으면, 두 번째 쿼리까지 함께 처리하려다가 문법 오류가 발생할 수 있습니다.
반면, null 문자를 삽입하면 mysqli_query() 함수는 null 문자 이후의 문자열을 인식하지 못하게 되어, 첫 번째 쿼리만 정상적으로 실행됩니다. 이때 쿼리 구조에는 큰 변화가 없어 보이지만, null 문자 덕분에 이후 구문이 무시됩니다.
하지만 주의할 점은, MySQL 서버 자체에는 쿼리 전체가 그대로 전송된다는 것입니다. 따라서 mysql.log와 같은 로그 파일에는 null 문자 이후의 내용까지 모두 기록됩니다. 즉, mysqli_query()는 null 문자 이후를 처리하지 않지만, 전송은 되기 때문에 로그에는 남게 되는 것입니다.
'웹 해킹 > Lord of SQLi' 카테고리의 다른 글
[Lord of SQL Injection] xavis 문제 풀이 (0) | 2025.05.08 |
---|---|
[Lord of SQL Injection] zombie_assassin 문제 풀이 (0) | 2025.05.01 |
[Lord of SQL Injection] succubus 문제 풀이 (0) | 2025.04.30 |
[Lord of SQL Injection] assassin 문제 풀이 (0) | 2025.04.28 |
[Lord of SQL Injection] giant 문제 풀이 (0) | 2025.04.24 |