0. Start again
- 기존에 모의해킹 취업을 준비하면서 SQLi 공부에 도움을 받은 사이트이다. 이번엔 한 달 동안 [ALL CLEAR]
1. hell fire
[+] query : select id,email,score from prob_hell_fire where 1 order by
- 쿼리는 "prob_hell_fire" 테이블에서 "id", "email", "score" 열을 선택하고, "1" 조건으로 모든 레코드를 검색 후 정렬("order by")
- 기존 문제와는 다르게 쿼리문의 ORDER BY절 사용
[+] MySQL의 ORDER BY 절 이해
- DB에서 가져온 결과를 열 기준으로 정리할 때 사용되며, 오름차순(ASC), 내림차순(DESC)으로 정렬
- 기본적으로 입력하지 않을 때, ASC로 사용
- 형태
~~ order by [컬럼명]; # DB의 결과를 특정 컬럼을 기준으로 정렬
~~ order by [컬럼명]='값'; # DB의 조건에 맞는 값을 찾은 후 정렬
종합하면,order by [컬럼명]='값'; 은 주어진 [컬럼명]의 값이 [값]과 일치하는 행을 선택하고,
그 결과를 [컬럼명]을 기준으로 정렬하여 보여주는 기능을 수행합니다.
이를 통해 특정 조건을 만족하는 데이터를 원하는 순서대로 정렬된 형태로 검색 가능
즉, ORDER BY절을 논리적으로 맞게(틀리면 답이 없다...) 사용하여 답을 찾는 Blind SQL Injection!!!!
※ 아래 내용부터는 스포가 될 수 있다. 공부 목적이신 분은 블라인드 SQLi에 대해 스스로 해결!! 하시길~
2. code
[+] 전체 코드
<?php
include "./config.php";
login_chk();
$db = dbconnect();
if(preg_match('/prob|_|\.|proc|union/i', $_GET[order])) exit("No Hack ~_~");
$query = "select id,email,score from prob_hell_fire where 1 order by {$_GET[order]}";
echo "<table border=1><tr><th>id</th><th>email</th><th>score</th>";
$rows = mysqli_query($db,$query);
while(($result = mysqli_fetch_array($rows))){
if($result['id'] == "admin") $result['email'] = "**************";
echo "<tr><td>{$result[id]}</td><td>{$result[email]}</td><td>{$result[score]}</td></tr>";
}
echo "</table><hr>query : <strong>{$query}</strong><hr>";
$_GET[email] = addslashes($_GET[email]);
$query = "select email from prob_hell_fire where id='admin' and email='{$_GET[email]}'";
$result = @mysqli_fetch_array(mysqli_query($db,$query));
if(($result['email']) && ($result['email'] === $_GET['email'])) solve("hell_fire");
highlight_file(__FILE__);
?>
[+] 필터링 (블랙리스트 기법) Preg_match 사용
- UNION SQLi 방지
[+] Solve 조건
- id : admin의 email을 찾기
3. Solve
[+] 페이로드 작성 및 조건 정리
- admin의 email의 찾는 문제
- email의 길이확인 및 한문자씩 출력하여 찾기
[+] 파이썬 코드
- email 길이 추측 : for i in range(100): 반복문을 사용하여 길이 추측
> i 변수를 ~99까지 해당 범위의 길이로 웹 페이지의 응답 체크 (설마 그이상은 아니겠..)
> 만약 응답에 특정 문자열이 포함되면, 비밀번호 길이를 찾은 것으로 판단하고 반복문 종료
- 비밀번호 추측: for i in range(1, email+1): 비밀번호의 각 문자 추측
> 중첩된 반복문을 사용하여 ASCII Printable 문자들을 순회하면서 각 위치의 문자 추측
> 웹 페이지의 응답을 확인하고, 특정 조건이 충족되면 문자를 admin_email 변수 하나씩 추출
'소소한 IT이야기 > WARGAME' 카테고리의 다른 글
[Lord of SQL Injection] evil_wizard 24번 (feat. Blind SQLi) (0) | 2023.08.08 |
---|---|
[Lord of SQL Injection] dark_eyes 22번 (2) | 2023.03.27 |
[Lord of SQL Injection] 21번 iron golem (feat. error based sqli) (2) | 2023.02.11 |