pikachu-sql注入


1.概述

1.1发生原因

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

1.2SQL注入攻击流程

第一步:注入点探测

  • 自动方式:使用web漏洞扫描工具,自动进行注入点发现
  • 手动方式:手工构造SQL注入测试语句进行注入点发现

第二步:信息获取

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

  • 1.环境信息:数据库类型,数据库版本,操作系统版本,用户信息等
  • 2.数据库信息:数据库蜜罐,数据库表,表字段,字段内容等(加密内容破解)

第三步:获取权限

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

1.3注入点类型

分类根据:输入的变量传入到SQL语句是以什么类型拼接的

  • 数字型:user_id=$id
  • 字符型:user_id=‘$id‘
  • 搜索型:text LIKE ‘%{$_GET[‘search‘]}%‘"

2.数字型注入(POST)

这里可以根据我们选择的 userid 返回用户名和邮箱

 

 

 因为是用POST语句取得我们传递的参数值,传递给一个变量,再到数据库查询。所以我们猜测后台的查询语句大概是下面这样的

$id=$_POST[‘id‘]
select 字段1,字段2 from 表名 where id=1$id

下面我 BurpSuite 抓包来测试一下

 

 

 

 

 

把传入的参数改成1 or 1=1,看看返回的结果

注入成功

 

 

 

 三、字符型注入

 

 

 

 kobe‘ or 1=1#

 

 

 

 

 

 

 注入成功

四、搜索型注入

 

 

 k%‘ or 1=1#

 

 

 

注入成功

 

 

五.XX型注入

构造的payload如下

kobe‘) or 1=1#

 

 

 

 

六、insert/update注入

我们就填必填的两项,用户那里输入单引号,密码随便输入,页面会有报错信息,说明存在SQL注入漏洞

 

 

 

这种情况下,我们知道后台使用的是 insert 语句,我们一般可以通过 or 进行闭合。后台的 SQL 语句可能是下面这个样子

insert into member(username,pw,sex,phonenum,email,adderss) values(‘doge‘, 11111, 1, 2, 3, 4);

构造下面的 payload,基于 insert 下的报错来进行注入

adminminmin 'or updatexml(1, concat(0x7e,database()), 0) or '两个单引号分别闭合 values数据的前后两个单引号,所以不用注释后面的句子

 

 注入成功

 

七、delete注入

这里有一个留言板,点删除可以把对应的留言删掉我们点删除并用 BurpSuite 抓包,实际上就是传递了一个留言的 id,后台根据这个 id 去删除留言

 

 

 

 构造出 or updatexml(1, concat(0x7e,database()), 0) 在id=67后

 

八、http header 注入

有些时候,后台开发人员为了验证客户端头信息(比如cookie验证)

或者通过http header获取客户端的一些信息,比如useragent,accept字段等

 

会对客户端的http header信息进行获取并使用SQL进行处理,如果此时并没有足够的安全考虑

则可能会导致基于 http header 的 SQL 注入漏洞

登陆之后会记录以下信息

 

 下面BurpSuite修改发包内容

 

 把 User-Agent 改为一个单引号,发包看看后台处理的结果,发现直接报了 SQL 语法错误

 

 

还有 cookie 也是可以注入的,后端可能会取得我们的 cookie,后端通过拼接 SQL 语句进行验证

 

 

九、盲注boolian

我们在皮卡丘平台一进行实验,输入下面的测试语句

kobe‘ and 1=1#

 

 

kobe‘ and 1=2#

 

 

于是利用and来构造payload

kobe' and ascii(substr(database(),1,1))=112 #

来一个个进行测试,爆出database

不对的话就会出现用户名不存在,正确的话就会出现用户正确信息,可采用二分法来减少盲注次数

十、盲注time

 

 

 

 发现其存在时间盲注,只要kobe存在就会执行后面的响应五秒延迟

根据这个在加上测试

 

 

payload: kobe' and if((substr(database(),1,1))='p',sleep(4),null) #

此时412ms就返回结果,说明数据库名第一位是p
将p改为a,则1ms返回结果
说明数据库名第一位是p

十一、宽字节注入

当我们用通常的测试 payload时,是无法执行成功的,下面的payload会报错

kobe‘ or 1=1#

 

 

抓包看一下

 

 

因为在后台单引号会被转义,在数据库中执行时多了个反斜杠。我们可以用下面的payload,在单引号前面加上 %df,让单引号成功逃逸

kobe%df‘ or 1=1#

 

 

 

 成功

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM