flag18 数据分类

# include <stdio.h>
void main()
{
int i,j,en=1;
int count=0;
int b[5]={0};
int a[5]={0};
double average=0.0;
scanf("%d",&i);
int val=i;
while(i--)
{
scanf("%d",&j);
if(j%10==0)
{
a[0]=a[0]+j;
b[0]=true;
}
else if(j%5==1)
{
if(en)
{
a[1]=a[1]+j;
en--;
}
else 
{
a[1]=a[1]-j;
en++;
}
b[1]=true;
}
else if(j%5==2)

a[2]=a[2]+1;
b[2]=true;
}
else if(j%5==3)
{
count++;
a[3]+=j;
average=average+j;
b[3]=true;
}
else if(j%5==4)
{
if(j>a[4])
{
a[4]=j;
b[4]=true;
}
}
}
average=average/(count+0.0);
for(int k=0;k<5;k++)
{
if(k!=3)
{
if(b[k])
printf("%d",a[k]);
else 
printf("N");
}
if(k==3)
{
if(b[k])
printf("%.1f",average);
else 
printf("N");
}
if(k<4)
printf(" ");
}
}

<think>嗯,用户想解决SQLi-Lab第18关的flag问题。首先,我需要回忆一下第18关的特点。SQLi-Lab通常是一个练习SQL注入的平台,每一关都有不同的注入点。第18关可能涉及到HTTP头部的注入,比如User-Agent或者Referer之类的字段,因为之前的关卡可能已经覆盖了GET和POST参数注入。 用户提到“null”,可能在思考是否与NULL值有关,但根据提供的引用内容,引用[1]和[3]涉及的是SQL中的NULL处理和空字符串比较,引用[2]是关于指针和NULL的比较写法。不过,这些引用可能和用户的问题关联不大,可能只是系统自动提供的参考内容。需要确认用户的真实需求:他们需要的是第18关的解法,而不是直接处理NULL值。 接下来,我需要考虑第18关的可能漏洞类型。第18关通常涉及基于错误的注入或二次注入,或者是HTTP头部的注入。比如,有些关卡会利用User-Agent头或Referer头进行注入。可能需要通过修改这些头部来触发注入点,从而获取flag。 可能的步骤包括: 1. 确定注入点:尝试在HTTP头部如User-Agent、Referer或X-Forwarded-For中注入SQL代码。 2. 错误回显:如果页面返回了数据库错误信息,可以基于错误信息提取数据。 3. 构造注入语句:比如使用联合查询或基于时间的盲注。 4. 获取数据库信息:如数据库版本、表名、列名,最终找到存储flag的表和字段。 比如,修改User-Agent头为注入语句,如' OR 1=1 -- ,观察响应是否有变化。或者使用报错注入,如通过updatexml或extractvalue函数触发错误,从而泄露数据。 另外,可能需要闭合原本的SQL语句结构。例如,原语句可能是INSERT INTO某个表,包含User-Agent和IP等字段。通过注入闭合引号,插入UNION SELECT语句来获取数据。 用户可能需要具体的payload示例,比如: ' UNION SELECT 1,2,group_concat(table_name) FROM information_schema.tables WHERE table_schema=database() -- 然后根据回显结果,找到flag所在的表,再查询对应的列和值。 最后,确保给出的步骤清晰,并提示可能存在不同的解法,如基于错误、联合查询或时间盲注,视关卡的具体情况而定。</think>### SQLi-Lab第18关解法分析 SQLi-Lab第18关通常涉及**HTTP头部注入**,尤其是`User-Agent`或`Referer`字段的注入。以下是关键步骤: 1. **确定注入点** 尝试在HTTP请求的头部字段(如`User-Agent`)中添加单引号`'`,观察是否返回数据库错误。若出现错误(如`You have an error in your SQL syntax`),则说明该字段存在注入漏洞。 2. **构造闭合语句** 原SQL语句可能是: $$INSERT INTO logs (useragent, ip) VALUES ('$user_agent', '$ip')$$ 通过闭合单引号并注释后续内容实现注入: ```sql ' OR 1=1 -- ``` 3. **利用报错注入提取信息** 使用`updatexml()`函数触发错误回显,例如: ```sql ' AND updatexml(1, concat(0x7e, (SELECT database())), 1) -- ``` 错误信息中会包含当前数据库名称[^1]。 4. **获取表名与列名** ```sql ' AND updatexml(1, concat(0x7e, (SELECT group_concat(table_name) FROM information_schema.tables WHERE table_schema=database())), 1) -- ``` 类似方法可获取列名(如`flag`列)。 5. **提取flag** 最终注入语句示例: ```sql ' AND updatexml(1, concat(0x7e, (SELECT flag FROM flag_table LIMIT 1)), 1) -- ``` 错误信息中会显示部分flag内容,需通过多次截取拼接完整值[^2]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值