4.Orc 풀이.
소스 코드는 id가 admin이고, pw가 사용자가 입력한 값과 일치하는 id를 select하는 쿼리문.
실제 DB에 저장되어 있는 admin의 pw와 사용자가 입력한 값이 같아야 한다.
즉, 실제 admin의 pw를 알아야 한다.
생소한 함수들이 몇 개 있으니 분석해본다.
$_GET[pw] = addslashes($_GET[pw]);
addslashes는 DB에 저장이 될 때 특수문자 앞에 \를 넣어준다.
$query = "select pw from prob_orc where id='admin' and pw='{$_GET[pw]}'";
$result = @mysql_fetch_array(mysql_query($query));
if(($result['pw']) && ($result['pw'] == $_GET['pw])) solve("orc");
즉 admin의 pw를 찾는 blind sql injection.
blind sql injection은 결과값을 화면에 보여주지 않고, 값이 True or False 값을 가지고 찾아가는 방법.
length 함수를 사용해서 pw 길이부터 찾아본다.
length 함수는 문자열 길이를 구하는 함수.
Ex==> length('QWERT')일 때는 5가 리턴.
?pw=%27%20or%20length(pw)=8%20%20and%20id=%27admin%27%23를 입력하면 위와 같은 화면이 등장.
문자열 길이를 알았으니, substr 함수를 이용해서 pw를 알아본다.
SUBSTR(string,position,[substring_length])..................
String ==> 입력 문자열을 지정. 입력 값이 NULL이면 결과로 NULL이 반환.
Position ==> 문자열을 추출한 시작 위치를 지정.
Substring_length ==> 추출할 문자열의 길이를 지정.
LENGTH(pw) = '8'에서 Hello admin이라는 문구가 출력된 것을 보니 pw의 길이는 8.
이 문제의 경우 prob라는 단어가 필터링 되고 있어서 아무래도 substr은 힘들 거 같다.
다른 문자열 함수인 LIKE..
pw LIKE '0%' 부터 시작해서 맞는 값이 나오면 또 '?0%'
8글자를 충족시킬 때까지 하면 295d5844라는 값이 도출된다.
Cf) LOS 여태 푼 문제 중에 제일 어려웠다.
노가다처럼 풀 수도 있지만, Mysql을 이용해서 풀 수도 있고, 아니면 파이썬 코드를 이용해서 풀 수도 있다.
나중에 2개의 다른 풀이를 추가해서 올리도록 하겠다.
'# Related site issues > LOS' 카테고리의 다른 글
6.Darkelf. (0) | 2018.05.07 |
---|---|
5.Wolfman. (0) | 2018.05.07 |
3.Goblin. (0) | 2018.05.06 |
2.Cobolt. (0) | 2018.05.06 |
1.gremlin. (0) | 2018.05.06 |