보안 전공생의 공부

wargame.kr #4 login filtering | SQL 우회기법 본문

Wargame/web

wargame.kr #4 login filtering | SQL 우회기법

수잉 2021. 1. 15. 10:54

우회방법으로 로그인을 하라고 한다. 일단 start를 누르면

이렇게 로그인 페이지가 뜨고, 페이지 소스코드를 확인해보면 다음과 같다.

<?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.

변수 id와 ps가 둘다 설정되어있으면 "../lib.php"를 포함시키라고 한다.

▷ isset 함수 : 해당변수가 설정되었는지 확인 ( https://www.codingfactory.net/10067)

▷ POST, GET 함수 : 데이터를 저장, 데이터를 불러올 목적으로 쓰임

mysql_connect("localhost","login_filtering","login_filtering_pz");

mysql_select_db ("login_filtering");

mysql_query("set names utf8");

데이터베이스와 PHP 연동시키는 query문이다.

 

$key = auth_code("login filtering");

$id = mysql_real_escape_string(trim($_POST['id']));

$ps = mysql_real_escape_string(trim($_POST['ps']));

변수 id와 ps는 각각 입력받은 id와 ps 문자열의 앞과 뒤에 있는 공백을 제거해주고 , 특수문제를 회피한 것이다.

( trim : https://coding-factory.tistory.com/129 )

( mysql_real_escap_string : https://m.blog.naver.com/PostView.nhn?blogId=mindisit&logNo=220674770702&proxyReferer=https:%2F%2Fwww.google.com%2F )

$row=mysql_fetch_array(mysql_query("select * from user where id='$id' and ps=md5('$ps')"));

변수 row는 입력받은 id와 ps(md5암호화된)로 테이블 user 을 전체 조회하여 읽은 것이다.

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..";

}

}

?>

만약 변수 row에 설정된 id가 guest나 blueh4g 이면 로그인이 실패된 것이고, 아니면 성공한 것이다.

<!--

you have blocked accounts.

guest / guest

blueh4g / blueh4g1234ps

-->

주석은 내가 갖고 있는 막힌 계정들을 알려준다.

guest/guest

blueh4g/blueh4g1234ps

어떻게 접근하면 좋을지 php 우회방법과 sql 우회기방법을 찾아보았다.

php 우회 방법 모음 : https://m.blog.naver.com/xkdlffpshf/221368224853

 

 

PHP 필터링 우회기법

잘 알려지고 자주 쓰이는 연산자,함수는 필터링되기 마련이다. 그래서 php일때 필터링 우회기법을 여기다 ...

m.blog.naver.com

sql 우회 방법 모음 : https://dorahee.tistory.com/140

 

 

 

이 문제는 단순히 입력받은 문자열을 필터링하는 것이다.

그런데 변수들은 MySQL로 받으므로, SQL 우회기법을 사용하는 것이 더 적합한 것 같다.

SQL 구문이 대소문자를 구분하지 않는 것을 이용하는 것이 입력받는 문자열을 우회할 수 있는 방법으로 소개되어있다.

https://qastack.kr/programming/153944/is-sql-syntax-case-sensitive

 

if($id=='guest' || $id=='blueh4g'){

echo "your account is blocked";

}else{

echo "login ok"."<br />";

echo "Password : ".$key;

}

만약 내가 id값으로 guesT를 입력하면 SQL에서는 guest와 똑같이 받아들여 조회를 하겠지만, PHP에서는 guesT != guest 라고 인식하고 else구문을 실행할 것이다(PHP는 명령문에 대해서는 대소문자를 구분하지 않지만 변수는 다르다).

내가 가진 막힌 계정 중 첫번째인

guest / guest를 이용해보았다.

id값만 비교하므로 guesT/guest를 입력하였다.

로그인이 성공하였고, 플래그값이 주어진다.

 

+) 피드백

SQL Injection을 찾을 수 있는 팁 : 함수 중에 mysql_real_escape_string 함수가 있는데, 이 함수가 보이면 일단 SQL Injection인가 의심하고 시도해보아야한다.

결론적으로 mySQL이 대소문자 구분하지 않으니까 이걸 이용해서 문제를 풀면 되는 것이였다.

전에 교육받을 때 메모해놨던 링크다 ! 왜 이제야 생각났는지 ㅎㅎ..

https://ar9ang3.tistory.com/7

Comments