본문 바로가기
Write Up/webhacking.kr_old

Webhacking.kr Challenge(old)_8번문제

by 비원(Be one) 2020. 6. 2.
반응형

여러분 안녕하세요. 세이버입니다.

 

이번 강에서는 Webhacking.kr old 8번 문제를 풀어보겠습니다.

 

이 문제는 예전 Webhacking.kr 8번 문제와 비슷하니 참고하시면 좋습니다.

Webhacking.kr 문제풀이_Part8_8번 문제 : https://poci.tistory.com/60

 

Webhacking.kr 문제풀이_Part8_8번 문제

여러분 안녕하세요. POCI입니다. 원래 순서상 7번 문제를 풀어야 되지만, 현재 7번 문제는 데이터베이스 오류로 인해 풀 수 없습니다. 그렇기에 이번에는 8번 문제를 풀어보도록 하겠습니다. 1. 사�

poci.tistory.com


1. 문제 파악하기

8번 문제를 클릭해봅시다.

옆에 데이터베이스 표시가 있는걸로 보아 SQL인젝션 관련 문제인 거 같습니다.

 

8번 문제를 클릭하면 hi guest라는 문구와 view-source 링크가 있습니다.

 

링크를 클릭하면 소스코드가 나옵니다.

 

 

코드 중간에 sql코드가 있는 걸로 보아 SQL 인젝션이 확실해졌습니다.

 

노가다를 또....

SQL인젝션에 관한 설명을 아래 링크를 참고하시기 바랍니다.

SQL Injection 공격 : https://poci.tistory.com/49

 

SQL Injection 공격

SQL Injection 공격은 웹해킹에서 가장 많이 쓰이는 공격 기법 중 하나입니다. SQL와 Injection(주입하다)의 합성어로, SQL를 주입하는 공격이라는 의미입니다. SQL Injection 공격은 아이디, 비밀번호를 적��

poci.tistory.com

 

2. 코드 해석하기

php 코드를 해석해야 문제를 해결할 수 있을 거 같습니다.

<?php
$agent=trim(getenv("HTTP_USER_AGENT"));
$ip=$_SERVER['REMOTE_ADDR'];
if(preg_match("/from/i",$agent)){
  echo("<br>Access Denied!<br><br>");
  echo(htmlspecialchars($agent));
  exit();
}
$db = dbconnect();
$count_ck = mysqli_fetch_array(mysqli_query($db,"select count(id) from chall8"));
if($count_ck[0] >= 70){ mysqli_query($db,"delete from chall8"); }

$result = mysqli_query($db,"select id from chall8 where agent='".addslashes($_SERVER['HTTP_USER_AGENT'])."'");
$ck = mysqli_fetch_array($result);

if($ck){
  echo "hi <b>".htmlentities($ck[0])."</b><p>";
  if($ck[0]=="admin"){
    mysqli_query($db,"delete from chall8");
    solve(8);
  }
}

if(!$ck){
  $q=mysqli_query($db,"insert into chall8(agent,ip,id) values('{$agent}','{$ip}','guest')") or die("query error");
  echo("<br><br>done!  ({$count_ck[0]}/70)");
}
?>

$agent=trim(getenv("HTTP_USER_AGENT"));

이 부분에서 HTTP_USER_AGENT의 값을 agent변수에 대입합니다.

 

$result = mysqli_query($db,"select id from chall8 where agent='".addslashes($_SERVER['HTTP_USER_AGENT'])."'");

여기서 쿼리를 실행하고

if($ck){
  echo "hi <b>".htmlentities($ck[0])."</b><p>";
  if($ck[0]=="admin"){
    mysqli_query($db,"delete from chall8");
    solve(8);
  }
}

쿼리의 결과가 admin이면 해결됩니다.

 

if(!$ck){
  $q=mysqli_query($db,"insert into chall8(agent,ip,id) values('{$agent}','{$ip}','guest')") or die("query error");
  echo("<br><br>done!  ({$count_ck[0]}/70)");
}

만약 쿼리의 결과가 없으면 값을 추가하는 거 같습니다.

 

HTTP_USER_AGENT의 값은 패킷 안에 있으므로 BurpSuite가 필요합니다.

BurpSuite 설치법은 아래 링크를 참고하시기 바랍니다.

Burp Suite - 패킷 위변조 프로그램 : https://poci.tistory.com/53

 

Burp Suite - 패킷 위변조 프로그램

1. Burp Suite란?? Burp Suite(버프 스위트)는 프록시 서버를 사용하여 클라이언트와 서버가 주고받는 패킷을 가로채 위변조가 가능하게 해주는 프로그램으로, 웹해킹에서 주로 쓰입니다. 2. 설치법 우�

poci.tistory.com

 

3. 패킷 살펴보기

패킷을 보면 User-Agent가 있습니다. 이 값이 데이터베이스와 연동되는 부분입니다.

 

이 값을 '로 바꿔봤습니다.

 

query error이 뜨는 걸로 봐서 이 부분을 이용해서 SQL 인젝션을 하면 될 거 같습니다.

 

 

 

3. 데이터베이스 구조 살펴보기

if(!$ck){
  $q=mysqli_query($db,"insert into chall8(agent,ip,id) values('{$agent}','{$ip}','guest')") or die("query error");
  echo("<br><br>done!  ({$count_ck[0]}/70)");
}

이 부분은 ck(쿼리의 결과)가 없다면 insert into chall8(agent,ip,id) values('{$agent}','{$ip}','guest')이 실행되는 부분입니다.

agent는 User-Agent의 값, ip는 컴퓨터의 ip, id는 guest입니다.

 

즉, chall8의 구조는 이렇게 세 개의 컬럼으로 돼있다는 걸 알 수 있습니다.

만약 사용자가 처음 접속한다면 이렇게 값이 대입됩니다.

하지만 문제는 id가 admin이면 해결이지만, id는 무조건 guest만 들어가도록 되어있습니다.

그건 SQL 인젝션을 이용해 id가 admin이 되도록 해야 한다는 뜻입니다.

 

 

4. SQL 인젝션

이제 SQL 인젝션을 해보겠습니다.

 

일단 id가 admin이 되도록 값을 넣어야 하므로 

if(!$ck){
  $q=mysqli_query($db,"insert into chall8(agent,ip,id) values('{$agent}','{$ip}','guest')") or die("query error");
  echo("<br><br>done!  ({$count_ck[0]}/70)");
}

이 부분의

insert into chall8(agent,ip,id) values('{$agent}','{$ip}','guest') 를 조작해야 합니다.

 

우리가 건들 수 있는 건 {$agent}뿐 이므로 빨간 부분을 조작해야 합니다.

insert into chall8(agent,ip,id) values('{$agent}','{$ip}','guest')

 

 

Uesr-Agent의 값을 이렇게 조작하면 쿼리의 값이 아래처럼 됩니다.

insert into chall8(agent,ip,id) values('Saver', '1', 'admin'), ('guest','{$ip}','guest')

 

그러면 테이블에는 이렇게 저장됩니다.

 

 

이제 

$result = mysqli_query($db,"select id from chall8 where agent='".addslashes($_SERVER['HTTP_USER_AGENT'])."'");

이 부분을 조작해 ch가 admin이 되도록 해야 합니다.

 

select id from chall8 where agent='".addslashes($_SERVER['HTTP_USER_AGENT'])."'

빨간 부분을 조작해야 합니다.

 

User-Agent를 아까 admin으로 설정한 값으로 바꾸면

select id from chall8 where agent='saver'

이렇게 되므로 ch가 admin이 되어 문제가 해결됩니다.

 


오늘도 수고하셨습니다.

 


정리

- php를 해석

- 데이터베이스 구조를 분석한다.

- User-Agent에 SQL 인젝션을 하여 원하는 값을 맞춰준다.


강의가 유익하셨거나 마음에 드셨으면 구독과 좋아요, 댓글 부탁드립니다.

궁금하신 점이나 질문은 댓글이나 메일을 남겨주세요.

 

poci5003@gmail.com

 

반응형