[LOS] 18번 nightmare 풀이
2019. 8. 8. 14:03ㆍ문제풀이/los.rubiya.kr
<?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__);
?>
이번 금지 문자열은 prob _ . () # -이며, pw의 글자수가 6자를 넘어가면 안된다는 조건이 적혀있다.
#을 쓰면 안되니까 쓸 수 있는 주석은 --+과 ;%00가 있는데, --+는 3글자, ;%00는 2글자니까 ;%00를 사용한다.
뒷부분의 and id!='admin'를 무효화해야하니까 주석은 반드시 적어야 하고,
나머지 최대 4글자로 pw에 들어가는 부분을 참으로 만들어야한다.
알고보면 되게 쉬운문젠데, 알기까지가 엄청 어려운 문제다...
힌트는 논리식은 거짓일 때 0, 참일 때 1을 값으로 갖는다는 것!
빠르게 풀어보자면...
일단 pw의 (' 이부분이 있기 때문에 ')로 닫아준다.
그럼 입력할 수 있는 값은 밑의 OO와 같이 2글자가 남는다.
where pw=('')OO;%00') and id!='admin'
여기서 아까 말한 힌트, 논리식은 0이나 1을 값으로 갖는다는 것이 쓰인다.
바로, pw=('') 이부분이 논리식이라는걸 알면 된다!
pw=('')는 거짓이므로 0을 값으로 갖는다.
따라서 OO에 =0이나 <1 등을 넣어주면 전체적으로는 참값을 갖게 되는 것이다.
'문제풀이 > los.rubiya.kr' 카테고리의 다른 글
[LOS] 17번 zombie_assassin 풀이 (0) | 2019.08.08 |
---|---|
[LOS] 16번 succubus 풀이 (0) | 2019.08.07 |
[LOS] 15번 assassin 풀이 (0) | 2019.08.07 |
[LOS] 14번 giant 풀이 (0) | 2019.08.07 |
[LOS] 13번 bugbear 풀이 (0) | 2019.08.07 |