일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 웹개발
- 그래프
- node.js
- nodeJS
- 포렌식
- mongoose
- 뷰
- 포렌식워게임
- materialize
- NavBar
- 자료구조
- GIT
- gitbash
- 워게임
- 써니나타스
- 이진탐색트리
- 자바기초
- 워게임추천
- node
- MongoDB
- 이진트리
- 웹해킹기초
- 웹해킹
- Express
- 자바문제풀이
- 자바
- wargame.kr
- 웹기초
- CTF
- bootstrap
- Today
- Total
보안 전공생의 공부
wargame.kr #4 login filtering | SQL 우회기법 본문
우회방법으로 로그인을 하라고 한다. 일단 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이 대소문자 구분하지 않으니까 이걸 이용해서 문제를 풀면 되는 것이였다.
전에 교육받을 때 메모해놨던 링크다 ! 왜 이제야 생각났는지 ㅎㅎ..
'Wargame > web' 카테고리의 다른 글
HackCTF #5 Guess me (0) | 2021.01.15 |
---|---|
Lord of SQL Injection#6 darkelf (0) | 2021.01.15 |
Lord of SQL Injection#5 wolfman | White Space filtering (0) | 2021.01.15 |
Lord of SQL Injection#4 orc | Blind SQL Injection (0) | 2021.01.15 |
wargame.kr #6 fly me to the moon | javascript 난독화 (0) | 2021.01.15 |