Iriton's log
[los.rubiya] gremlin write-up 본문
필요 개념 정리
- preg_math(): 인자로 전달받은 정규 표현식과 일치하는 패턴을 검색하는 php의 함수.⇒ 1. 정규식 표현 2. 검색 대상 문자열 3. 매칭된 값을 배열로 저장하고 싶을 시, 배열의 변수⇒ preg_math($pattern, %subject, $matches)
- ⇒ preg_math(’/정규식표현/’, ‘검색대상문자열’, ‘배열변수’)
- 세 가지 인자를 받는다.
- 정규 표현식: 문자열을 바탕으로 검색을 수행하여 패턴과 일치하는지 조사하고, 분할하는 문자열 처리 방법
- mysqli_fetch_array 함수는 특성상 한 번의 콜에 하나의 행만 가져올 수 있다.
- #: %23
- 공백: %20
query :
select id from prob_gremlin where id='' and pw=''
<?php
include "./config.php";
login_chk();
$db = dbconnect();
if(preg_match('/prob|_|\\.|\\(\\)/i', $_GET[id])) exit("No Hack ~_~"); // do not try to attack another table, database!
if(preg_match('/prob|_|\\.|\\(\\)/i', $_GET[pw])) exit("No Hack ~_~");
$query = "select id from prob_gremlin where id='{$_GET[id]}' and pw='{$_GET[pw]}'";
echo "<hr>query : <strong>{$query}</strong><hr><br>";
$result = @mysqli_fetch_array(mysqli_query($db,$query));
if($result['id']) solve("gremlin");
highlight_file(__FILE__);
?>
preg_match 코드 부분을 보면 GET으로 받은 값을 대상으로 /prob, _, ., (, ) 이 다섯 가지 표현을 검색한 후 매칭되는 패턴이 존재하면 exit 된다는 걸 알 수 있다.
즉, 아이디나 비밀번호에 해당 표현이 추가 되면 안 된다는 뜻이다.
(여기서부턴 내 추측) 쿼리문을 보면 아이디와 비밀번호를 입력 받으며 그 값을 데이터베잇에서 찾아 쿼리에 저장하고 result에 해당 쿼리값을 배열 형태로 저장한 뒤 if절을 통해 result 값에 아이디가 있으면 즉, 데이터베이스 내에 존재하는 아이디로 로그인 되면 성공하는 거 같다.
가장 유명한 공격 방식인
‘ or 1 = 1 #
이걸 사용하면 쿼리문이 참으로 되고 뒤에 코드는 주석 처리된다.
해당 값을 아이디에 입력하면 참이 되면서 아이디의 모든 값을 호출한다.
mysqli_fetch_array 함수는 한 행만 가져오기 때문에 prob_gremlin의 첫 행에 담긴 id 값이 호출되면서 문제가 풀린다.
pw 값에 공격문을 넣어도 문제가 풀렸다!
+) ?id= ‘ or 1 = 1 # 을 URL에 넣어서 자동인코딩 된 것으로는 문제가 안 풀린다.
#과 띄어쓰기까지 인코딩을 안 해줘서 그런 건데, or 앞뒤로 한 번 더 띄어쓰기를 하고 #도 %23으로 입력하면 풀린다.
1%27%20or%201=1%23
'WebHacking > WarGame' 카테고리의 다른 글
[los.rubiya] goblin write-up (0) | 2023.10.10 |
---|---|
[los.rubiya] cobolt write-up (0) | 2023.10.10 |
[root-me] Challenge: Install files (0) | 2023.10.04 |
[root-me] Challenge: File upload - Double extensions (0) | 2023.10.04 |
[Webhacking.kr] old-28 write-up (0) | 2023.10.04 |
Comments