开发者学堂课程【网络安全攻防 - Web渗透测试:SQL 注入攻击_2】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/630/detail/9905
SQL 注入攻击_2
内容介绍:
一、SQL 基础回顾
二、简单查询示例
三、条件查询示例
四、联合查询 UNION
一、SQL 基础回顾
SQL 注入攻击:
所谓 SQL 注入式攻击,就是输入域或页面请求的查询字符串,欺骗服务器执行恶意的 SQL 命令。
在某些表单中,用户输入的内容直接用来构造(或者影响)动态 SQL 命令,或作为存储过程的输入参数,这类表单特别容易受到 SQL 注入式攻击。
二、简单查询示例
1、当前库
dvwa dvwa.users
mysql> select user_id, first_name, last_name from users;
2、其它库
mysql.user
mysql> desc mysql. user;
mysql> select * from mysql.user;
mysql> select user, password, host from mysql. user;
3、其它库
wordpress.user
mysql> desc wordpress,.wp_users;
mysql> select * from wordpress. wp_users;
mysql> select user_login, user_pass from wordpress.wp_users
;
三、//条件查询示例
mysql> select user, password, host from mysql.user where user=
’root’;
mysql> select user, password, host from mysal. user where user='root'andhost='localhost';
mysql> select user, password, host from mysal. user where
user='root' or host='localhost';
注意:
column :字段或者列。row :行。clause :语句。
纯数字除外(数字不可做字段的值),不加引号是字段(列);加引号是字段的值。若关注字符串里面的值,则需使用引号(单双引号皆可使用)。
例如:
mysql> select user_id,user,password from users where user_id=1;
mysql> desc dvwa.users;
mysql> select user_id, first_name last_name from dvwa. users where first_name='yangge';
mysql> select user_id, first_name last_name from dvwa.userswherefirst_name='yangge'or1=1;
mysql 注入的前提是原来的语句不能改变,但是可以在此基础上加入成立条件。
or 条件:
不需要在意前面是否成立,只要后面成立,即代码查询成立。
mysql> select user_id, first_name last_name from dvwa.userswherefirst_name='admin'and1=2;
mysql> select user_id, first_name, last_name from dvwa. users where user_id=2;
mysql> select user_id, first_name, last_name from dvwa. users where user_id=7;
mysql> select user_id, first_name, last_name from dvwa. users where user_id=7 or 1=1;
四、//联合查询 UNION
mysql> select user, password from mysql. user;
mysql> select user_ login, user_pass from wordpress.wp_users;
mysql> select user, password from mysql.user unionselectuser_login,user_passfromwordpress. wp_users;
mysql> select user, password, host from mysql. user union select user_login, user_passfrom wordpress. wp_users;
ERROR 1222 (21000): The used SELECT statements have a different number of columns
1、出现以上情况解决方法是:
添加纯数字使得前后字段数一致,补的字段在前后补都可以。
注: union 查询前后字段数必须相同
mysql> select user, password, host from mysql. user union select user_login, user_pass, 3 from wordpress. wp_users;
2、为了使查验更方便,可以利用 limit 来帮助,方法如下:
mysql> select user, password, host from mysql. user union select user_login, user_pass, 3 from wordpress. wp_users limit 5;
即可查验出所求结果。
3、union 前面表不是所需要的,为了提所需要的后面表,可以利用如下方法:
mysql> select user, password, host from mysql.userwhere1=2unionselectuser_login,user_pass, 3 from wordpress. wp_users limit 5;
注:因为1=2不成立,所以 union 前面代码作废,即得所查。
显示的字段名, 应当关注里面的值,此处字段名在 union 前面已显示。
4、思考:前面的查询已经写死了,如何使下面的语句成功?
mysql> select * from dvwa. users
-> union
-> select user_login, user_pass from wordpress.wp_users
;
ERROR 1222 (21000): The used SELECT statements have a different number of columns
当此处“*”不知道是几个字段数量时的解决方法:
猜字段数
mysql> select * from dvwa. users union select 1;
mysql> select * from dvwa. users union select 1,2;
mysql> select * from dvwa. users union select 1,2,3;
mysql> select * from dvwa. users union select 1,2,3,4;
mysql> select * from dvwa. users union select 1,2,3,4,5;
mysql> select * from dvwa. users union select 1,2,3,4,5,6;
依次叠加试验,输入到框中,验证结果为:
最后在试到“1,2,3,4,5,6”时没有报错。
mysql> select * from dvwa. users union select user_login, user_pass,1,2,3,4 fromwordpress. wp_users;
2、当最后要的结果是 user_login, user_pass 时,为了方便查验,可在 union 前面代码中添加一个不成立的算式。
例如:
mysql> select *fromdvwa.userswhere1=3unionselectuser_login,user_pass,1,2,3,4fromwordpress. wp_users;
因为1=3不成立,所有前面代码作废,即得出想要结果。
两种查询方式:
条件 or 查询:整张表。
union 查询:加一条 select 语句,可以查其他的库,其也会受到权限的限制。