<html>
<head>
<title>Challenge 50</title>
</head>
<body>
<h1>SQL INJECTION</h1>
<form method=get>
id : <input name=id value='guest'><br>
pw : <input name=pw value='guest'><br>
<input type=submit> <input type=reset>
</form>
<hr><a href=./?view_source=1>view-source</a>
</body>
</html>
get 방식으로 넘긴당
초기화면 id: guest, pw: guest로 제출을 누르면 level: 1이라고 출력된다
<?php
if($_GET['id'] && $_GET['pw']){
$db = dbconnect();
$_GET['id'] = addslashes($_GET['id']);
$_GET['pw'] = addslashes($_GET['pw']);
$_GET['id'] = mb_convert_encoding($_GET['id'],'utf-8','euc-kr');
foreach($_GET as $ck) if(preg_match("/from|pw|\(|\)| |%|=|>|</i",$ck)) exit();
if(preg_match("/union/i",$_GET['id'])) exit();
$result = mysqli_fetch_array(mysqli_query($db,"select lv from chall50 where id='{$_GET['id']}' and pw=md5('{$_GET['pw']}')"));
if($result){
if($result['lv']==1) echo("level : 1<br><br>");
if($result['lv']==2) echo("level : 2<br><br>");
}
if($result['lv']=="3") solve(50);
if(!$result) echo("Wrong");
}
?>
id와 pw는 addslashes()로 쿼터 처리를 해줍니다
mb_convert_encoding()의 쓰임은 아래와 같아요
mb_convert_encoding($val, $to_encoding, $from_encoding)
비슷한 함수로는 iconv()가 있슴다
stringiconv5($to_encoding,$from_encoding, $str)
어쨌든 $_GET['id'] = mb_convert_encoding($_GET['id'],'utf-8','euc-kr'); 는,
GET 방식으로 넘긴 id를 euc-kr 인코딩 방식을 utf-8로 바꿔준다는 의미입니다
foreach()에서는 ck 변수마다 여러 문자열과 부호들을, 그 밑 if문에서는 id에서 'union'을 필터링해요
중요한 부분은 이 곳인데
$result = mysqli_fetch_array(mysqli_query($db,"select lv from chall50 where id='{$_GET['id']}' and pw=md5('{$_GET['pw']}')"));
id는 내가 입력한 것, pw는 내가 입력한 것을 md5 인코딩한 것에 대한 lv를 select해서 3이면 풀립니다
생각해볼것은, md5로 인코딩되는데 그 pw를 특정하기란 매우 힘든데.. 이걸 어떻게 풀지?인 것 같아여
내가 그걸 알려고 시도하면 힘들 것 같고.. 그냥 주석으로 날리는게 좋겠다 생각했습니다
하지만 pw = md5()가 나오기 전 --로 날려버리면 lv=3을 맞출 때 union을 써야 할 텐데
id에서는 필터링 돼서 3을 어케 할 수가 없기 때문에..
/* */를 통해 인코딩부분만 날리고 pw부분에 남은 union문을 써보기로 했슴니다
select lv from chall50 where id='{$_GET['id']}' and pw=md5('{$_GET['pw']}')에서, 회색 부분을 날려볼게요
그럼 id는 아무거나 치고 뒤에 /*,
pw에는 */로 시작해서 주석을 닫아준 후 union select 3을 적고 뒷 부분은 또 주석으로 날려주면 되겠네요
전체적인 쿼리문은 아래와 같고 보라색 부분은 제가 입력할 것, 회색부분은 주석이라서 날아갑니당
select lv from chall50 where id='admin'/*' and pw=md5('*/union select 3--')
공백 우회를 위해 공백은 %0a로 해볼게여
쿼터는 addslashes() 함수로 우회하는데, 자세히 설명되어 있어요- https://securitynote.tistory.com/3
결론은 쿼터로 인한 오류 방지를 위해 쿼터 앞에 역슬래시를 넣어 인식함
- 역슬래시는 필터링 됨
- 앞에 %a1~%fe와 같은 문자값을 삽입에 '%a1\'을 한 문자로 인식하게 하여 필터링 우회함의 순서임다
그래서, id: admin%a1'/*이고 pw: */union select 3--라고 생각하여 아래 쿼리를 넣어봤다.
?id=admin%a1'/*&pw=*/union%0aselect%0a3--
하지만 마지막 주석 처리 부분 '--'도 '#'으로 바꾸고 %23으로 우회를 시도해봤다.
'Wargame > webhacking.kr' 카테고리의 다른 글
Challenge old 43 (250) (0) | 2020.03.01 |
---|---|
*Challenge old 52 (400) (0) | 2020.02.21 |
Challenge old 41 (250) (0) | 2020.02.18 |
Challenge old 42 (200) (0) | 2020.02.18 |
Challenge old 61 (200) (0) | 2020.02.18 |