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就会加载五秒,如果不是就会立刻返回

 

 

posted @ 2020-04-04 11:29  mxm$  阅读(802)  评论(0编辑  收藏  举报