[webhacking.kr] 59번 문제 풀이[SQL Injection]
💡 Webhacking.kr challenge(old) 59번 문제에 대한 풀이입니다.
문제
# 로그인 기능
if($_POST['lid'] && isset($_POST['lphone'])){
$_POST['lid'] = addslashes($_POST['lid']);
$_POST['lphone'] = addslashes($_POST['lphone']);
$result = mysqli_fetch_array(mysqli_query($db,"select id,lv from chall59 where id='{$_POST['lid']}' and phone='{$_POST['lphone']}'"));
# 클리어 조건
if($result['id']){
echo "id : {$result['id']}<br>lv : {$result['lv']}<br><br>";
if($result['lv'] == "admin"){
mysqli_query($db,"delete from chall59");
solve(59);
}
}
# 회원가입 기능
if($_POST['id'] && isset($_POST['phone'])){
$_POST['id'] = addslashes($_POST['id']);
$_POST['phone'] = addslashes($_POST['phone']);
if(strlen($_POST['phone'])>=20) exit("Access Denied");
if(preg_match("/admin/i",$_POST['id'])) exit("Access Denied");
if(preg_match("/admin|0x|#|hex|char|ascii|ord|select/i",$_POST['phone'])) exit("Access Denied");
mysqli_query($db,"insert into chall59 values('{$_POST['id']}',{$_POST['phone']},'guest')");
}
회원가입과 로그인기능을 이용해서 admin lv로 로그인을 하면 성공하는 문제입니다.
문제 풀이
회원가입 시에 사용되는 sql 구문입니다.
insert into chall59 values('{id}',{phone},'guest')
id, phone에 각각 적용되는 조건입니다.
- id
- addslashes()
- admin 필터링
- phone
- addslashes()
- 길이 < 20
- admin / 0x / # / hex / char / ascii / ord / select 필터링
로그인 시에 사용되는 sql 구문입니다.
select id,lv from chall59 where id='{id}' and phone='{phone}'
id,phone에는 각각 addslashes가 적용되어 있습니다.
회원가입쪽 부분을 보면 집중적으로 필터링이 되어 있습니다. 그렇다면 필터링된 부분들을 우회해서 admin lv로 회원가입을 해야 풀릴 가능성이 높습니다.
기본적으로 addslashes 가 되어 있기 때문에, id 쪽에서는 db의 명령어를 수행하기가 어렵습니다. 그리고 phone쪽에는 addslashes때문에 db의 명령어를 수행할 때 문자열을 사용하기 어렵습니다. 그리고 필터링된 단어들은 모두 ascii 숫자들로부터 문자열을 생성(hex,char) 하거나 0x로 문자를 입력하는 것을 막고 있습니다.
위의 조건들은 id쪽에서 문자열을 입력하고, phone쪽에서 id쪽의 문자를 이용하는 방식으로 문제를 풀 수 있습니다.
다음과 같이 id에 문자열을 입력, phone에서 해당 문자를 db 함수를 이용하여 바꿔줌으로써 id lv 로 회원가입이 됩니다.
-
id : nimda
-
phone : 111,reverse(id))– // 맨 마지막에 공백 필요
해당 변수로 생성되는 쿼리문
sql insert into chall59 values('nimda',111,reverse(id))-- ,'guest')
이렇게 회원가입을 한다음 nimda, 111로 로그인 해주면 문제가 풀립니다.
회원가입
로그인
댓글남기기