Oh! JUN

[Lord Of SQL Injection] 18번(('1')==0?) ;00% 본문

문제풀이/Lord of SQL Injection

[Lord Of SQL Injection] 18번(('1')==0?) ;00%

Kwon Oh! JUN 2022. 2. 6. 03:28

query : select id from prob_nightmare where pw=('') and id!='admin'



<?php 
  
include "./config.php"
  
login_chk(); 
  
$db 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 = @mysqli_fetch_array(mysqli_query($db,$query)); 
  if(
$result['id']) solve("nightmare"); 
  
highlight_file(__FILE__); 
?>


쿼리를 살펴보니까 그 동안 푼거랑은 형태가 다르다.

pw=('') 특이하게 가로가 쳐져있는걸 확인할 수 있다.

 

★ 조건

#,- 주석문자들이 예외처리 된걸 확인 할 수 있다.

pw는 6자리 이하이다.

 

★ 해결방안

pw=('')를 참으로 만들어줘야 된다.

id != admin를 주석처리해야 한다.

pw는 6자리를 넘어서는 안된다.

 


pw=('') and id!='admin' 부분을 pw=('')=0;%00') and id!='admin' 이렇게 만들어주었다.

('')=0 이 부분이 중요한데 ('')(문자열)=0(숫자) 문자열과 숫자를 비교하는 구문이다.

문자열과 숫자를 비교할때 문자열의 첫 단어부터 숫자를 추출하고 숫자랑 비교를 해야한다.

하지만 대부분의 문자열의 첫 단어는 숫자가 아니기 때문에 숫자가 아닌 문자들을 모두 0으로 치환을 시키고 숫자랑 비교를 한다.

 

('apple')(문자열) 0(숫자)
 
00000 0

           

그래서 ('apple')은 0으로 치환되고 숫자 0이랑 비교를 하기 때문에

('apple') = 0 (참)

('apple') = 1 (거짓)

 

 

[LOS]18번 nightmare

나이트메어.. 굉장히 힘든문제였다...ㅠㅠ 굉장히 조건이 까다로워서 힘들었다. 길이가 최대 6글자까지만 입력가능하다.... 닫는 쿼터,괄호,주석만 해도 반이상을 써버리는데 조건은 언제 쓸 수

g0pher.tistory.com


주석처리하는 방법에는 

1. #

2. --

3. ;%00

 

1, 2번은 예외처리 되어있으니까 ;%00을 사용해서 주석처리를 한다.


pw=('')=0;%00') and id!='admin'

 

;%00 뒤에는 주석처리 되니까 무시되고, 남는거는 pw=('')=0이다.

결과적으로 ('')=0는 참이니까

 

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

 

NIGHTMARE Clear!


<?php 
  
include "./config.php"
  
login_chk(); 
  
$db 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 = @mysqli_fetch_array(mysqli_query($db,$query)); 
  if(
$result['id']) solve("nightmare"); 
  
highlight_file(__FILE__); 
?>