본문 바로가기
war game/웹 워게임(los)

load of sql injection nightmare

by 강깅꽁 2016. 9. 15.
반응형

<?php 
  
include "../config.php"
  
login_chk(); 
  
dbconnect(); 
  if(
preg_match('/prob|_|\.|\(\)|#|-/i'$_GET[pw])) exit("No Hack ~_~"); 
  if(
strlen($_GET[pw])>6) exit("No Hack ~_~"); 
  
$query "select id from prob_nightmare where pw=('{$_GET[pw]}') and id!='admin'"
  echo 
"<hr>query : <strong>{$query}</strong><hr><br>"
  
$result = @mysql_fetch_array(mysql_query($query)); 
  if(
$result['id']) solve("nightmare"); 
  
highlight_file(__FILE__); 
?>


소스코드 분석

주석이 막혀 있다.. 이거를 푸는 내내 sql의 혁명을 느끼게 되었다.


풀이


엄청나다.. sql의 혁명이였다..

우선 주석 형태가 모두 막혀 있기 떄문에 

세미콜론 뒤에 NULL을 넣어주면 이게 주석역할을 해준다. 

즉 ;%00을 해주면 뒤에는 주석으로 처리된다.


또한 여기서 중요한 개념은 true= false=false 이것이다.

이게 의미하는 바가 무엇이냐 false=false 이것은 true가 된다. 즉 true=true이다.

이제 pw의 구문을 거짓=거짓으로 만들어주면 참이 되게 된다.

즉 페이로드를

pw=')=false;%00 으로 보내 주어야 하지만 길이가 한정되어 있끼 떄문에 false를 0으로 바꾼다. 

거짓=거짓이 되어 참이 되고 뒤에 부분은 주석처리 되면서 클리어 가능하다.


select id from prob_nightmare where pw=('')=0;%00') and id !='admin'