반응형
별로 좋아보이진 않는 문제
<?php
include "../../config.php";
if($_GET['view_source']) view_source();
?><html>
<head>
<title>Chellenge 39</title>
</head>
<body>
<?php
$db = dbconnect();
if($_POST['id']){
$_POST['id'] = str_replace("\\","",$_POST['id']);
$_POST['id'] = str_replace("'","''",$_POST['id']);
$_POST['id'] = substr($_POST['id'],0,15);
$result = mysqli_fetch_array(mysqli_query($db,"select 1 from member where length(id)<14 and id='{$_POST['id']}"));
if($result[0] == 1){
solve(39);
}
}
?>
<form method=post action=index.php>
<input type=text name=id maxlength=15 size=30>
<input type=submit>
</form>
<a href=?view_source=1>view-source</a>
</body>
</html>
이렇길래 우회방식으로
1\\\’ or 1=1
방법을 떠올려냈다. 근데 안먹힌다. 구문상 전혀 오류는 없는데 왜 안먹히는진 모르겠음;; 걍 다른방법으로 풀라는 것 같은데
Mysql에서 VCHAR이 아닌 CHAR방식으로 데이터를 저장할 때 생기는 공백에 관한 취약점이 있었다.
CHAR형 데이터 안에 id 키값으로 admin이 있을때, admin 이라는, 공백을 추가한 문자열을 넣었을 때 where id = 'admin ' 이 true가 된다. 이런 취약점을 이용하는 문제고, 싱글쿼터를 하나 입력하면 싱글쿼터 두개로 바뀌는 코드와 substr을 통해 15번째자리까지만 문자열을 자르는 코드를 생각하여 아래와 같은 답을 생각해낼 수 있다.
admin+공백9개+'
따라서 admin '인것이다. 싱글쿼터하나가 더블쿼터로 바뀌는데에 상관없이 15자리로 잘리기 때문에 싱글쿼터 하나로만 전달되게 된다.
member값으로는 admin 말고도 1 2 3 4 숫자들을 넣어도 되더라. 그냥 값 여러개들이 들어가 있는 것 같다. 이 member 에 없는 값을 토대로 풀면 문제는 안풀리는게 당연. 이부분은 걍 때려맞춰야한다.
뭐 그냥 훼이크인진 모르겠는데 애초에 역슬래시를 필터 주어지는 문제였으면 나처럼 풀게끔 해야하지 않았을까.. 저 방법이 문제에서 주어진 내용들을 충분히 이용한 결과이기도 하고, 문제가 없다고 생각되는데..
1\\\’ or 1=1
-> \\ replace
1\' or 1=1
-> ' replace
1\'' or 1=1 // 여기서 \'는 기능의 목적이 아닌 '문자 자체를 의미하게됨.
실제로 내가 관리하는 mysql에
select * from sample where id='1\'' or 1=1;
하면 잘 처리된다. (sample 테이블의 모든 데이터가 출력됌)
일례로 또한, select 'single \' quote'; 하면 single ' quote 출력 잘 됨.
반응형
'[웹해킹] > [Webhacking.kr]' 카테고리의 다른 글
[Webhacking.kr] 41번 (0) | 2020.11.10 |
---|---|
[Webhacking.kr] 40번 (0) | 2020.11.05 |
[Webhacking.kr] 38번 (0) | 2020.11.03 |
[Webhacking.kr] 37번 (0) | 2020.10.28 |
[Webhacking.kr] 36번 (0) | 2020.10.28 |