LOS 포스트는 이해한 내용과 복습을 위한 목적으로 작성되었습니다.

이번 포스트는 Orge에 이어 troll 문제에 대한 이해와 풀이를 진행해보도록 하겠습니다.

troll은 Orge에서 사용했던 머리를 조금 식히는 겸 팁을 가져가기 위한 단계라고 생각하시면 되겠습니다.

생김새만 보면 Blind SQL injection을 할 것만 같은 비주얼이지만 어찌저찌 쉬어갈 수 있게 됐습니다 하하..



 

 문제 이해


문제 소스코드는 다음과 같이 PHP 소스를 그대로 보여주는 것을 알 수 있습니다.

<?php  
	include "./config.php"; 
	login_chk(); 
	dbconnect(); 
	if(preg_match('/\'/i', $_GET[id])) exit("No Hack ~_~");
	if(@ereg("admin",$_GET[id])) exit("HeHe");
	$query = "select id from prob_troll where id='{$_GET[id]}'";
	echo "<hr>query : <strong>{$query}</strong><hr><br>";
	$result = @mysql_fetch_array(mysql_query($query));
	if($result['id'] == 'admin') solve("troll");
	highlight_file(__FILE__);
?>


위의 문제에서 6번 라인에서는 SQL Injection을 수행할 때 admin이라는 단어를 찾아낸다면 참을 반환하도록 하여, exit() 함수가 실행되도록 하였습니다. 즉, 여러분은 쿼리를 작성할 때 admin을 사용할 수 없습니다.

그러나, id가 admin인 값을 찾아내라고 합니다. 


또한 5번 라인에서는 싱글쿼터(Single Quote)를 사용할 수 없습니다. 그렇다면 문자열을 그대로 넣어줄 수 없다는 것을 의미하며, 쿼리문을 조작할 수 없다는 의미입니다..


흠흠. 그럼에도 불구하고 admin이 되도록 쿼리를 작성해야함은 분명합니다...




 

 문제 풀이(쿼리)


GET 형태이기 때문에 다음과 같이 쿼리를 짜주었습니다.

가장 치명적인 싱글쿼터가 필터링이 되었으므로, 문자열 내부에 들어가질 값에 대한 변조를 어떻게 해야할지 알아내야 합니다.

여기서 눈여겨볼 것이 eregi 함수입니다.


eregi의 취약점은 다음과 같습니다.


 

 eregi 함수의 취약점


eregi 함수는 대소문자를 구분한다는 취약점을 가지고 있습니다.

오히려 대소문자를 구분하기 때문에 admiN이라고 쓰거나, Admin이라고 작성하게 되면 'admin'과는 다른 문자로 인식하게 되어 참을 반환하지 않습니다...!


또한 여기서 eregi 함수가 where문에 들어가는 값을 비교한다는 것입니다.

where문에 들어가는 문자는 대소문자를 구분하지 않고 선택하게 됩니다.


즉, select * from prob_troll where id='admiN'과 같이 대소문자를 구분하여도, 'admin'에 해당하는 값이 반환되게 된다는 것입니다.


 

 대소문자 구분을 통한 쿼리 작성


https://los.rubiya.kr/chall/troll_05b5eb65d94daf81c42dd44136cb0063.php?id=admiN


위의 쿼리는 id=admiN 이라고 작성해주었습니다.

여기서는 admiN이든 Admin이든 AdMiN 이든 admin이 아닌 대소문자로 구분된 admin을 작성해주시면 됩니다.


+ Recent posts