《Web安全攻防 渗透测试实战指南 》 学习笔记 (五)
Web安全攻防 渗透测试实战指南 学习笔记 (五)
第四章 Web安全原理解析 (一)
(一)SQL注入的原理
1.web应用程序对用户输入数据的合法性没有判断。
2.参数用户可控:前端传给后端的参数内容是用户可以控制的。
3.参数带入数据库查询:传入的参数拼接到SQL语句,且带入数据库查询。
举个栗子:
select * from users where id=1 and 1=1
当1=1为真,且where语句中id也为真,页面会返回与id=1相同的结果。
当传入的id参数为and 1=2时,由于1=2为假,所以页面就会返回与id=1不同的结果。
(这样就说明,你构造的sql语句是被执行了,由此可以初步判断id参数存在sql注入漏洞~)
(二)Mysql注入
1.MySQL介绍
Mysql5.0版本以后,mysql默认在数据库中存放一个“information_schema”的数据库。
在该库中,读者需要记住三个表名,分别是SCHEMATA、TABLES、COLUMNS。
SCHEMATA表存储该用户创建的所有数据库的库名,该表中记录数据库库名的字段名为SCHEMA_NAME。
TABLES表存储该用户创建的所有数据库的库名和表名,该表中记录数据库库名和表名的字段名分别为TABLE_SCHEMA和TABLE_NAME。
COLUMNS表存储该用户创建的所有数据库的库名、表名和字段名,该表中记录数据库库名、表名和字段名的字段名为TABLE_SCHEMA、TABLE_NAME和COLUMN_NAME。
2.Mysql小知识点
database() : 当前网站使用的数据库
version():当前mysql的版本
user():当前mysql的用户
3.MySQL查询语句
(1)在不知道任何条件下,你可以试试:
select 要查询的字段名 from 库名.表名
(2)知道一条已知条件时,你可以试试:
select 要查询的字段名 from 库名.表名 where 已知条件的字段名=‘已知条件的值’
(多条已知条件的话,使用 and 连接~)
4.limit用法
limit子句可以被用于强制 SELECT 语句返回指定的记录数。limit 接受一个或两个数字参数。参数必须是一个整数常量。
如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。初始记录行的偏移量是 0(而不是 1): 为了与 PostgreSQL 兼容,MySQL 也支持句法: limit # OFFSET #。
举几个例子~
mysql> SELECT * FROM table LIMIT 5,10; // 检索记录行 6-15
//为了检索从某一个偏移量到记录集的结束所有的记录行,可以指定第二个参数为 -1: mysql> SELECT * FROM table LIMIT 95,-1; // 检索记录行 96-last. //如果只给定一个参数,它表示返回最大的记录行数目: mysql> SELECT * FROM table LIMIT 5; //检索前 5 个记录行 //换句话说,LIMIT n 等价于 LIMIT 0,n。
id=-1+union select 1,select table_name from information_schema.tables where table_schema='库名' limit 0,1 ,3
select column_name from information_schema.columns where table_schema='库名' and table_name='表名' limit 0,1;
当访问id=1 union select 1,2,3时,执行的sql语句为:
select * from users where id=1 union select 1,2,3
因此,即可获取数据库中的数据~
参考资料:
《Web安全攻防 渗透测试实战指南》