Kali学习笔记42:SQL手工注入(4)
前三篇文章都是在讲发现SQL注入漏洞
如何查询得到所有的信息
那么另一条思路还未尝试过:能否修改数据?
例如这样:
'; update users set user='yiqing' where user='admin
理论上是会成功的,由于DVWA编写BUG,导致无法执行
实战中,可以这样直接修改数据
可以修改,那么就可以插入数据:
'; INSERT INTO users (' user_id',' first_name',' last_name',' user','password','avatar') VALUES ('35','yiqing','xu','xyq','5f4dcc3b5aa765d61d8327deb882cf99','OK'); --
更恶意的人可以删库:
'; DROP TABLE users; --
由于DVWA的编写问题,这些示例都不能成功
可以这样说:正式由于程序员水平不够,阴差阳错防止了一部分SQL注入
到这里其实基本的手工SQL注入就说完了
实战中,SQL注入考验的是一个人的综合素质
以及对数据库本身的了解程度
一个人如果是SQL注入方面的大师,那么他一定是数据库方面的专家
接下来对DVWA三种SQL注入的源码进行分析:
低级别:
<?php if(isset($_GET['Submit'])){ // Retrieve data $id = $_GET['id']; $getid = "SELECT first_name, last_name FROM users WHERE user_id = '$id'";
$result = mysql_query($getid) or die('<pre>' . mysql_error() . '</pre>' ); $num = mysql_numrows($result); $i = 0; while ($i < $num) { $first = mysql_result($result,$i,"first_name");
$last = mysql_result($result,$i,"last_name"); echo '<pre>';
echo 'ID: ' . $id . '<br>First name: ' . $first . '<br>Surname: ' . $last;
echo '</pre>'; $i++;
}
}
?>
分析:
没有对输入做任何过滤,直接放入SQL语句
最后对结果进行输出
缺陷:
1.对输入没有任何过滤
2.如果查询失败,直接返回数据库错误信息,不妥
中级别:
<?php if (isset($_GET['Submit'])) { // Retrieve data $id = $_GET['id'];
$id = mysql_real_escape_string($id); $getid = "SELECT first_name, last_name FROM users WHERE user_id = $id"; $result = mysql_query($getid) or die('<pre>' . mysql_error() . '</pre>' ); $num = mysql_numrows($result); $i=0; while ($i < $num) { $first = mysql_result($result,$i,"first_name");
$last = mysql_result($result,$i,"last_name"); echo '<pre>';
echo 'ID: ' . $id . '<br>First name: ' . $first . '<br>Surname: ' . $last;
echo '</pre>'; $i++;
}
}
?>
分析:使用函数:
mysql_real_escape_string()
对输入进行过滤
这个函数的作用:给非法字符'"/%#等字符前面加上转义符号:\
还有一个地方存在问题:SQL语句没有使用拼接的方式,所以SQL注入不需要单引号进行闭合
新版本的PHP语言采用其他函数:MySQLi,PDO_MYSQL
结论:
1.SQL注入漏洞还是存在,而且会报错,理论上可以避免一部分SQL注入
2.无意义代码:既然过滤了单双引号,那么为什么要改SQL语句,使得不需要引号就可以注入
3.依然可以SQL注入,有方法绕过输入过滤
注入方式:
其实注入比刚才反而简单了:比如查所有的表
0 union select table_name,table_schema from information_schema.tables
高级别:
<?php if (isset($_GET['Submit'])) { // Retrieve data $id = $_GET['id'];
$id = stripslashes($id);
$id = mysql_real_escape_string($id); if (is_numeric($id)){ $getid = "SELECT first_name, last_name FROM users WHERE user_id = '$id'";
$result = mysql_query($getid) or die('<pre>' . mysql_error() . '</pre>' ); $num = mysql_numrows($result); $i=0; while ($i < $num) { $first = mysql_result($result,$i,"first_name");
$last = mysql_result($result,$i,"last_name"); echo '<pre>';
echo 'ID: ' . $id . '<br>First name: ' . $first . '<br>Surname: ' . $last;
echo '</pre>'; $i++;
}
}
}
?>
分析:
首先函数
stripslashes()
去掉字符\
然后再进行中级别的特殊字符转义
这些都是小问题,之所以高级别,在于下面这个函数:
is_numeric()
如果输入不是一个数字,那么什么都不执行
结论:很安全,几乎不可能找到SQL注入漏洞
到这里SQL手工注入就完成了
后边将说一说SQL盲注和SQL自动注入,以及神器SQLMAP
最新文章
- awk实现join
- Android图片加载库的理解
- Excel 使用宏批量修改单元格内指定文字为红字
- “破锣摇滚”乐队(codevs 1444)
- 11 自定制shell提示符
- 1.4Linux内核版本号的定义规则
- laravel学习前期遇到的小知识点(1)
- 解开Android应用程序组件Activity的";singleTask";之谜
- Java基础之静态变量
- MySQL中的空间扩展
- AngularJS的初始化
- Scroll View 深入
- Linux定时任务深入学习
- API Gateway性能比较:NGINX vs. ZUUL vs.Cloud Gateway vs. Linkerd[译]
- hadoop更改保存路径后,批量重启不能启动datanode(或者format以后不能启动datanode)
- ruby-super用法
- [Swift]在Swift项目中创建桥接头文件,Swift文件和Objective-C文件相互调用
- Django Web开发学习笔记(4)
- 自然语言处理之:搭建基于HanLP的开发环境(转)
- python 多线程 并发socket实例
热门文章
- 马拉车算法——求回文子串个数zoj4110
- Shell常用快捷键
- JVM内存结构--新生代及新生代里的两个Survivor区(下一轮S0与S1交换角色,如此循环往复)、常见调优参数
- 为什么MySQL数据库要用B+树存储索引?
- python函数默认参数陷阱
- python入门编程之mysql编程
- 相机标定问题-Matlab &; Py-Opencv
- VS2013+ffmpeg开发环境搭建
- 绕最新版安全狗-附上sqlmap的tamper
- 关于使用spring版本4.1.6注解@Import报错