by-pass를 하는 문제인것 같은데 우회하라는 뜻인가?
일단 들어가보았다.
아무런 표시 없이 로그인 창이 나오게 되는데
ID 와 PW를 알아보기 위해서 get_source를 들어가서 페이지 소스를 보았다.
소스파일을 볼 수 있는데 여기서 봐야될것이 몇가지 있다.
you have blocked accounts.
guest / guest
blueh4g / blueh4g1234ps
block이 되어있는 것 같지만 한번 로그인을 시도해봤다.
예상했지만 block되었다고 메세지를 표시해준다.
그럼 소스코드를 다시 살펴보자
<?php
if (isset($_GET['view-source'])) {
show_source(__FILE__);
exit();
}
/*
create table user(
idx int auto_increment primary key,
id char(32),
ps char(32)
);
*/
if(isset($_POST['id']) && isset($_POST['ps'])){
include("../lib.php"); # include for auth_code function.
mysql_connect("localhost","login_filtering","login_filtering_pz");
mysql_select_db ("login_filtering");
mysql_query("set names utf8");
$key = auth_code("login filtering");
$id = mysql_real_escape_string(trim($_POST['id']));
$ps = mysql_real_escape_string(trim($_POST['ps']));
$row=mysql_fetch_array(mysql_query("select * from user where id='$id' and ps=md5('$ps')"));
if(isset($row['id'])){
if($id=='guest' || $id=='blueh4g'){
echo "your account is blocked";
}else{
echo "login ok"."<br />";
echo "Password : ".$key;
}
}else{
echo "wrong..";
}
}
?>
<!DOCTYPE html>
<style>
* {margin:0; padding:0;}
body {background-color:#ddd;}
#mdiv {width:200px; text-align:center; margin:50px auto;}
input[type=text],input[type=[password] {width:100px;}
td {text-align:center;}
</style>
<body>
<form method="post" action="./">
<div id="mdiv">
<table>
<tr><td>ID</td><td><input type="text" name="id" /></td></tr>
<tr><td>PW</td><td><input type="password" name="ps" /></td></tr>
<tr><td colspan="2"><input type="submit" value="login" /></td></tr>
</table>
<div><a href='?view-source'>get source</a></div>
</form>
</div>
</body>
<!--
you have blocked accounts.
guest / guest
blueh4g / blueh4g1234ps
mysql구문을 이야기하는것 같다. (mysql은 한번도 공부해본적이 없어서 잘은 모른다.)
1. POST 방식으로 입력받은 id ,ps 값이 존재하는지 확인
2. mysql_real_escape_string_trim 함수를 이용해서 공백문자와 특수문자를 제외하여 SQL injection을 방지한다.
3. id 값을 확인하고 guest or blue4g이면 block
4. id 값이 3이 아니면 OK를 출력하고 MD5으로 인코딩된 FLAG를 보여준다.
5. id 값이 아무것도 없으면 Worng을 출력
guest / guest
blueh4g / blueh4g1234ps
분명히 else문을 이용해서 다른 값을 입력했는데도 wrong이 출력된다.
그럼 소스코드안의 if문의 필터링을 우회해보기로 했다.
$key를 사용해서 로그인 필터링으로 값을 구분했던것 같다.
if($id=='guest' || $id=='blueh4g'){ /* id 값이 guest or blueh4g 이면 블락된 상태 */
echo "your account is blocked";
}else{
echo "login ok"."<br />"; /* id 값이 guest or blueh4g 만 아니면 성공 */
echo "Password : ".$key;
}
쿼리 자체는 대소문자를 구별하지 않는다.
그래서 Guest로 로그인을 해보았다. -> 나중에 알았지만 PHP는 대소문자를 구분하지 않는다고 한다.
필터링은 php에서 하고있다.
그래서 Guest를 입력하고 pw = guest를 입력하면 쿼리에서는 대소문자를 구분하지 않기 때문에
서로 같은 값이라고 인식을 하여 key를 내어준다.
'CTF > WebHacking' 카테고리의 다른 글
Wargame.kr - fly me to the moon (0) | 2021.02.16 |
---|---|
Wargame.kr - WTF_CODE (0) | 2021.02.13 |
Wargame.kr - QR CODE PUZZLE (0) | 2021.02.11 |
Wargame.kr - flee button (0) | 2021.02.11 |
Wargame.kr - already got (0) | 2021.02.11 |