Gae Ko's Blog

los : troll 본문

웹해킹 /[los] Lord of SQL

los : troll

Gae Ko 2017. 8. 16. 23:39

[코드분석]


<?php  
  
include "./config.php"
  
login_chk(); 
  
dbconnect(); 

↑DB와 연결하기 위한 코드


  if(preg_match('/\'/i'$_GET[id])) exit("No Hack ~_~");
  if(@
ereg("admin",$_GET[id])) exit("HeHe");

↑preg_match와 ereg함수를 통해 필터링


  $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");

↑문제의 포인트



[내 풀이]


코드를 보면 preg_match를 통해 싱글쿼터(')를 필터링하고 ereg함수를 통해 문자열 'admin'을 필터링한다.

그리고 id값을 GET방식으로 입력값을 넘겨받는데 이때 id값으로 'admin'이 들어와야 문제가 해결된다고 한다.


이번 문제는 지난 문제와 달리 새로운 함수 ereg함수를 사용한 코드가 사용되었다.


ereg 함수의 정의를 찾아보니

ereg( string $pattern, string $string, array &$regs ) 

검색 대상 문자열(string)에서 정규표현식으로 나타낸 패턴(pattern)과 일치하는 문자열이 발견될 경우에 true를 아닌 경우에 false를 반환해준다. ereg와 비슷한 동일한 문자열을 검색하는 함수로 eregi 함수도 있다.

이 둘의 차이점은 ereg함수는 대소문자 구별을 하는 함수이고 eregi함수는 대소문자 구별없이 똑같은 문자열을 찾는 함수이다.


여기서 대소문자 구별을 하지 않는다는 점과  mysql에서는 대소문자를 구별하지 않는 점을 주목해보자.

문제 코드에서 ereg함수로 'admin'을 필터링하지만 mysql 에서는 admin 과 ADMIN을 동일한 값으로 인식한다.

즉  id 입력값으로 'ADMIN'으로 해도 MYSQL에서는 'admin'으로 인식함과 동시에 ereg함수에서 필터링되지도 않는다 !



SUCCESS !!!





[p.s]


사실 ereg함수의 정의를 찾기 전에 ereg함수가 null문자 전까지만 체크해준다는 정보를 얻어서 그렇게 해보았지만


결과는 



아무런 반응이 없어서 민지언니에게 물어보았더니 

함수 중에 null문자 뒤를 무시하도록 되있는 함수가 있는데 아마 mysql함수에서 무시되도록한거 같다고 한다. 

그래서 한번 교육서버를 통해 위 방법처럼 null을 사용해보았다.



첫번째는 정확한 코드이고 

두번째는 세미콜론 뒤에 null문자를 인코딩한 %00를 추가해보았고 

세번째는 세미콜론 뒤에 null 문자를 영어로 추가했다.


나는 두번째 세번째 결과가 둘다 null문자를 통해 null값뒤에 있던 세미콜론을 무시해 생긴 erro가 날꺼라 예상했었는데

음..... 두번째에서 %00을 찾는 id값으로 같이 인식한건지....에러가 뜨지 않았다.


그래서 정확히 찾아볼라고 구글링해보았지만 성공하지 못했다 ㅠㅠ 

이거에 대해 정확히 아시는 분이 계시면 저에게 알려주세요 ㅠㅠ 


▶ 두번째 실행 : mysql에서 url인코딩문자는 인식되지 않기 때문에 

근데 싱글쿼터로 닫고나서 %00한건데 왜 에러 안뜨지 ?????






'웹해킹 > [los] Lord of SQL' 카테고리의 다른 글

los : skeleton  (0) 2017.08.17
los : vampire  (0) 2017.08.17
los : orge  (0) 2017.08.12
los : darkelf  (0) 2017.08.12
los : wolfman  (0) 2017.08.12