实验 | CTF-简易留言板

打开网址是个简易留言板,有两个输入框可以输入。

随便输入几个字符提交后,发先提交一条记录返回四个信息。这四个信息中,姓名和内容是由输入内容决定的,其他两个时间和ID是不可控的,时间获取的是当前时间,可能是使用了SQL的now()函数,ID可能是从1自动增长的。

试下注入,输入一个单引号',提示留言失败。在昵称输入两个单引号,留言成功,昵称显示只有一个单引号。这个应该是Insert二次注入。即插入语句存入数据库后,再读出我们需要的信息。

那么我们在昵称处输入 2’,‘3’,‘4’#  ,发现出现错误。那就在井号之前加一个括号)

提示留言成功,并且显示2,3读取时间变成了0000-00-00 00:00:00。可以猜到,ID为自增长,不可控,时间为函数,且在数据库中存储类型为datetime,因此无法读取出4;可控的点在2和3处,由于3的位置前有个单引号,无法控制,则注入点在昵称处,并且输出点为内容。

尝试一下将3替换为database(),试试能不能读取到数据库信息。

留言成功,结果显示guestbook,即为当前库名。

再试下版权信息。

版本信息显示5.5.39

再通过读取信息表,来确定当前表的值。

得到当前表名为intd

通过limit来读取第二个表的信息

发现了一个叫key的表

读取key表中的列信息

读取发现,第一列为id

更改limit读取第二列

第二列列名为key

接下来获取key表中的key字段的值。(其中`key`应该是反单引号,打出方式为切换为英文状态,按如下图红色标注键就打出来了。)

 通过id的轮流判断,当id=12的时候,出现了结果

实验总结:

1、二次注入:

攻击者构造的恶意数据存储在数据库后,恶意数据被读取并进入到SQL查询语句所导致的注入。防御者可能在用户输入恶意数据时对其中的特殊字符仅仅只是使用了 addslashes 或者是借助 get_magic_quotes_gpc 对其中的特殊字符进行了转义,在写入数据库的时候还是保留了原来的数据,但是数据本身还是脏数据,却被开发者认为是可信数据。当下一次Web程序调用存储在数据库中的恶意数据并执行SQL查询时,就发生了SQL二次注入 。比如在第一次插入数据的时候,数据中带有单引号,直接插入到了数据库中;然后在下一次使用中在拼凑的过程中,就形成了二次注入。

2、concat函数

concat()是一个函数,用于用于将两个字符串连接起来,形成一个单一的字符串,类似于字符串拼接。

concat(str1,str2,…)                       
返回结果为连接参数产生的字符串。如有任何一个参数为NULL ,则返回值为 NULL。可以有一个或多个参数。

为了阅读清晰,一般加上一个十六进制的分隔符~,其十六进制为0x7e(0x表示十六进制,7e是一个分隔符 ~)

猜你喜欢

转载自blog.csdn.net/qq_42646885/article/details/95049378