안녕하세요
이번 글에서 풀이할 문제는 HackCTF의 Login입니다.
[Web Hacking]
제목 : Login
문제 : http://ctf.j0n9hyun.xyz:2024/
최근에 정보보안 기법에 대한 책을 읽는 것이 있어서
빠르게 눈치챌 수 있었네요
풀이 시작합니다.
풀이
저는 처음부터 보자마자 Username과 Password에 abcd를 입력해보았습니다.
그랬을 때 URL 부분에는 http://ctf.j0n9hyun.xyz:2024/?id=abcd&pw=abcd
처럼 id와 pw가 그대로 노출되는 것을 볼 수 있었습니다. 여기서 최근에 배운 GET 방식이 떠올랐네요.
어찌 되었든,
페이지 소스를 보겠습니다.
<!DOCTYPE html>
<html>
<head>
<title> Login </title>
<meta charset="utf-8">
</head>
<body>
<center>
<h5> Login </h5>
<form action="./" method="get">
<input type="text" name="id" placeholder="Username">
<br>
<input type="password" name="pw" placeholder="Password">
<br>
<br>
<button type="submit">Login</button>
<a href="view.php" target="_blank"><button type="button">View Source</button></a>
</form>
</center>
</body>
</html>
여기에서 <a href .. 부분에 view.php가 눈에 띄어서 들어가게 되었는데요
<?php
highlight_FILE(__FILE__);
require_once("dbcon.php");
$id = $_GET['id'];
$pw = $_GET['pw'];
$pw = hash('sha256',$pw);
$sql = "select * from jhyeonuser where binary id='$id' and pw='$pw'";
$result = mysqli_fetch_array(mysqli_query($db,$sql));
if($result['id']){
$_SESSION['id'] = $result['id'];
mysqli_close($db);
header("Location:welcome.php");
}
?>
다음과 같은 php 코드를 볼 수 있습니다.
여기에서 select * from jhyeonuser where binary id = '$id' ... 부분이 SQL Injection 공격에 취약한 것 같네요
id에 '로 작은따옴표를 끝을내고 or '1==1'을 사용하여 내용을 참으로 만들고 #을 붙여서 뒤 패스워드 검사 부분을 주석처리해서 통과하게 만듭니다.
따라서 id 부분에 'or'1==1'#을 적으면 SQL Injection 공격을 하게 되고요, 다른 분들은 1=1 이라고 적는데.. 다른 언어 하던 버릇때문에.. 그런데 1==1이나 1=1 이나 같은 것 같네요.
이렇게 문제를 풀 수 있습니다.
감사합니다.
P.S.
<?php
highlight_FILE(__FILE__);
require_once("dbcon.php");
$id = $_GET['id'];
$pw = $_GET['pw'];
$pw = hash('sha256',$pw);
$sql = "select * from jhyeonuser where binary id='$id' and pw='$pw'";
$result = mysqli_fetch_array(mysqli_query($db,$sql));
if($result['id']){
$_SESSION['id'] = $result['id'];
mysqli_close($db);
header("Location:welcome.php");
}
?>
아까 보셨듯이 php 코드를 보고 꼼수를 사용할 수 있습니다.
마지막 코드에서 header("Location:welcome.php"); 라고 적혀있는데 이 부분을 통해 혹시 id와 비밀번호가 맞으면
welcome.php로 이동하나? 해서 합리적인 의심을 할 수 있습니다.
그래서.. 원래 URL에 /welcome.php라고 적어도 문제가 풀리긴 합니다.