Pikachu-SQL-Inject(SQL注入漏洞)
SQL Inject漏洞概述:
数据库注入漏洞,主要是开发人员在构建代码时,没有对输入边界进行安全考虑,导致攻击者可以通过合法的输入点提交一些精心构造的语句,从而欺骗后台数据库对其进行执行,导致数据库信息泄露的一种漏洞。
SQL Inject漏洞攻击流程:
SQL Inject漏洞-常见注入点测试:
- 数字型:user_id=$id
- 字符型:user_id='$id'
- 搜索型:text LIKE '%{$_GET['search']}%'"
数字型注入(post):
1.从下拉框中随便选择一个数字,进行查询。发现它没有在url中传参,说明是以post方式进行提交的
2.确认输入点是否存在注入漏洞。随机提交一个数字,我们选择1,并进行抓包
3.将抓到的数据包发送到repeater中,做测试。先输入一个payload “or 1=1”,点击提交。发现它把所有的用户都查询了出来。这就说明在id=1处,存在SQL注入漏洞,并且是数字型的SQL注入。
4.接下来我们可以自己拼接SQL语句,达到预期的结果。查询数据库的列数,输入union select 1,2,3.返回的结果显示没有三列
5.再输入union select 1,2,进行查询。没有报错,说明存在两列
6.查询当前数据库的名字
7.查询数据库中的表名
8.其他的操作均相同,只要嵌入正确的SQL语句就可以查询到
字符型注入(get):
1.根据提示,输入字符串kobe(随便输入的值)。返回uid和email
2.当输入不存在的用户时,会提示你不存在
3.我们发现它的请求是在url中提交的,是get请求
3.构建测试的payload。在kobe后加上or 1=1.提示用户名不存在
4.在kobe后加上单引号,输入kobe' or 1=1--+'.,提交之后发现把数据库中的变进行了遍历
搜索型注入:
1.根据提示,我们会猜想后台会根据数据库搜索的形式进行查询
2.根据前两次的注入类型,构造对应的闭合。查看源码。
3.进行闭合构造。构造出的闭合为'%xxxx%'or 1=1#%'。输入xxxx%'or 1=1#。查到了表中的所有内容
xx型注入:
1.与前面的逻辑相同。查看源码
2.构造闭合。根据源码构造出('xx')or 1=1#')。所以我们最终构造的闭合为xx')or 1=1#,输入进去
基于函数报错的信息获取:
基于报错的信息获取:在MYSQL中使用一些指定的函数来制造报错,从而从报错信息中获取设定的信息。select/insert/update/delete都可以使用报错来获取信息。后台没有屏蔽数据库报错信息,在语法发生错误时会输出在前端。
三个常用的用来报错的函数:
- updatexml():函数是mysql对xml文档数据进行查询和修改的XPATH函数
- extractvalue():函数是mysql对xml文档数据进行查询的XPATH函数
- floor():mysql中用来取整的函数
insert注入:用or做闭合
1.打开页面,点击注册。当前是一个insert注入,也就是说我们前端输入的数据,会通过插入的方式到后台的数据库中。
2.在用户处输入单引号,密码随便输入。提交。发现报错
3.在用户名处构造payload。aaa' or updatexml(1,concat(0x7e,database()),0) or '.看到报错出数据库名称。
update注入:
1.进行登录。修改个人信息就是通过使用update操作后台的数据库,把相关的内容更新为我们想要的内容
2.构造payload的方法和insert相同。所以我们把用户名修改为刚刚构造的payload aaa' or updatexml(1,concat(0x7e,database()),0) or '。提交。报错出数据库名称。
"delete"注入:
1.打开页面。是一个留言板的形式。我们点击删除并进行抓包。这个请求就是把我们对应的id传到后台,后台就会把对应的id留言进行删除
2.将抓到的数据包发送到repeater中。对id进行闭合操作。因为参数是以get请求提交的,所以要进行url的编码。提交
"http header"注入:
http header注入:出现sql注入的一种场景
1.点击提示,出现账号和密码,进行登录,并抓包。后台可能对我们的user agent进行了获取,在user agent处进行测试
2.查看抓到的数据包,将数据包发送到repeater页面进行测试。自己构造user agent。firefox' or updatexml(1,concat(0x7e,database()),0) or'
盲注:
盲注的概念:
在有些情况下,后台使用了错误消息屏蔽方法(比如@)屏蔽了报错,此时无法再根据报错信息来进行注入的判断。即盲注。根据表现形式不同,分为based boolian(真假盲注)和based time(时间盲注)
盲注(based boolian):
基于boolian的盲注主要表现症状:
--没有报错信息
--不管是输入正确的还是错误的,都只显示两种情况(0或1)
--在正确的输入下,输入and 1=1/and 1=2发现可以判断
1.输入单引号。不报错
2.输入kobe'and 1=1#.认为是正确的输出
3.进行一步步的猜解,输入kobe' and ascii(substr(database(),1,1))>113#.显示不存在
4.改成=112
盲注(base on time):
1.输入单引号。不存在
2.输入刚刚使用的payload。发现还是这样
3.输入kobe' sleep(5)#.暂停五秒返回数据
4.构造payload “kobe and if((substr(database(),1,1)))='p',sleep(5),null)”.如果第一个字符是p就会加载五秒,如果不是就会立刻返回